- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 SuperObject
库时,单个 JSON 对象当前缩进如下:
{
"name": "value",
"int_arr": [
1,2,3],
"obj_arr": [
{
"this": "that"
},{
"some": "thing"
}],
"another": 123
}
但是,这种缩进/格式并不像 JSON 所宣传的那样“用户友好”或“人类可读”。我用计算机语言理解,这不一定重要,但我想像这样格式化它:
{
"name": "value",
"int_arr": [1,2,3],
"obj_arr": [
{
"this": "that"
},
{
"some": "thing"
}
],
"another": 123
}
例如,当使用 JSONLint 时为了验证/格式化 JSON 代码,它以更简洁的方式进行。
如何修改 SuperObject
库以使其具有不同的格式?库中是否有特定的位置定义了这些格式规则?或者我是否必须深入研究许多不同地方的代码才能更改此设置?
最佳答案
感谢 David A
的评论,实现这些更改相当简单(在格式化源代码并了解库代码的工作原理之后)。所有格式设置均在 TSuperObject.Write
中实现,所有此类更改都可以在此处进行。
只有一个问题我无法弄清楚,那就是对象以外的类型的数组 - 值将转到下一行。但至少数组结尾和对象数组可以根据需要进行换行和缩进。
下面是 TSuperObject.Write
的修改版本(为了节省空间,未包含大多数子例程)。评论的更改:
常数:
const
TOK_SP: PSOChar = #32#32; //<-- added another #32
子程序:
procedure _indent(I: shortint; r: boolean);
begin
Inc(level, I);
if r then
with writer do
begin
{$IFDEF MSWINDOWS}
Append(TOK_CRLF, 2);
{$ELSE}
Append(TOK_LF, 1);
{$ENDIF}
for I := 0 to level - 1 do
Append(TOK_SP, 2); //<-- changed 1 to 2
end;
end;
程序主体:
begin
if FProcessing then
begin
Result := writer.Append(TOK_NULL, 4);
Exit;
end;
FProcessing := true;
with writer do
try
case FDataType of
stObject:
if FO.c_object.FCount > 0 then
begin
k := 0;
Append(TOK_CBL, 1);
if indent then
_indent(1, false);
if ObjectFindFirst(Self, iter) then
repeat
{$IFDEF SUPER_METHOD}
if (iter.val = nil) or not ObjectIsType(iter.val, stMethod) then
begin
{$ENDIF}
if (iter.val = nil) or (not iter.val.Processing) then
begin
if (k <> 0) then
Append(TOK_COM, 1);
if indent then
_indent(0, true);
Append(TOK_DQT, 1);
if escape then
DoEscape(PSOChar(iter.key), Length(iter.key))
else
DoMinimalEscape(PSOChar(iter.key), Length(iter.key));
if indent then
Append(ENDSTR_A, 3)
else
Append(ENDSTR_B, 2);
if (iter.val = nil) then
Append(TOK_NULL, 4)
else
iter.val.Write(writer, indent, escape, level);
Inc(k);
end;
{$IFDEF SUPER_METHOD}
end;
{$ENDIF}
until not ObjectFindNext(iter);
ObjectFindClose(iter);
if indent then
_indent(-1, true);
Result := Append(TOK_CBR, 1);
end
else
Result := Append(TOK_OBJ, 2);
stBoolean:
begin
if (FO.c_boolean) then
Result := Append(TOK_TRUE, 4)
else
Result := Append(TOK_FALSE, 5);
end;
stInt:
begin
str(FO.c_int, st);
Result := Append(PSOChar(SOString(st)));
end;
stDouble:
Result := Append(PSOChar(SOString(gcvt(FO.c_double, 15, fbuffer))));
stCurrency:
begin
Result := Append(PSOChar(CurrToStr(FO.c_currency)));
end;
stString:
begin
Append(TOK_DQT, 1);
if escape then
DoEscape(PSOChar(FOString), Length(FOString))
else
DoMinimalEscape(PSOChar(FOString), Length(FOString));
Append(TOK_DQT, 1);
Result := 0;
end;
stArray:
if FO.c_array.FLength > 0 then
begin
Append(TOK_ARL, 1);
if indent then
_indent(1, true);
k := 0;
j := 0;
while k < FO.c_array.FLength do
begin
val := FO.c_array.GetO(k);
{$IFDEF SUPER_METHOD}
if not ObjectIsType(val, stMethod) then
begin
{$ENDIF}
if (val = nil) or (not val.Processing) then
begin
if (j <> 0) then begin
Append(TOK_COM, 1);
if ObjectIsType(val, stObject) then begin //
if indent then //<-- create line break after object array items
_indent(0, true); //
end; //
end;
if (val = nil) then
Append(TOK_NULL, 4)
else
val.Write(writer, indent, escape, level);
Inc(j);
end;
{$IFDEF SUPER_METHOD}
end;
{$ENDIF}
Inc(k);
end;
if indent then
_indent(-1, true); //<-- changed "false" to "true" to create line break at end of array
Result := Append(TOK_ARR, 1);
end
else
Result := Append(TOK_ARRAY, 2);
stNull:
Result := Append(TOK_NULL, 4);
else
Result := 0;
end;
finally
FProcessing := false;
end;
end;
该代码将生成如下所示的 JSON 数据:
{
"name": "value",
"int_arr": [
1,2,3
],
"obj_arr": [
{
"this": "that"
},
{
"some": "thing"
}
],
"another": 123
}
关于json - 修改 SuperObject 以不同的方式格式化/缩进 JSON 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25374226/
一些 JSON 序列化器返回 null对于空字符串数据字段,例如 { "searchtext": null, "moretext": "contains something", "bookdat
如何从通用 JSON 获取所有“id”成员值。 不知道它的结构。因为它非常复杂并且有很多子对象。它必须循环遍历所有子对象。 再次针对那些不断询问示例 JSON 在哪里的人。我的问题是如何从包含此成员的
我正在使用 Delphi XE4 和 SuperObject 1.24 我有以下结构: type TMyArray = Array of Array of Variant; TMyRecord
我正在尝试使用 super 对象在类中调用一个过程,但它不起作用,我在这里做错了什么? 代码示例: program test_rpc; {$IFDEF FPC} {$MODE OBJFPC}{$H
我正在使用 SuperObject 生成 JSON。我正在使用的服务器有一些对数据结果进行排序的规范(这与数据排序相关的事实与我关于排序的实际问题无关)。问题是,服务器希望这些值按照排序方式列出,例如
我最近在解析 JSON 时遇到了困难。您会看到,在使用 CloudFlare 客户端接口(interface) API 时,我想查找特定 IP 的“威胁评级”。问题是,由于 API 的设计,格式是这样
我广泛使用 SuperObject JSON 库。我需要能够检查对象中是否存在特定元素。我可以检查元素的值,例如不存在的整数返回 0。但是,如果 0 确实存在,则它是可能的值之一 - 因此我不能依赖于
我的服务器有以下 JSON: { "userid":"12", "username":"TestChar", "logged":"yes", "status":"Premium
我有以下代码来序列化动态类数组。由于某种原因,SuperObject 序列化的是私有(private)变量而不是类属性名称。任何人都可以建议如何修复 SuperObject 中的此行为吗? class
类型: TData = record str: string; int: Integer; boo: Boolean; flt: Double; end; TDataArray = A
我有一个带有一些 TObjectList<> 字段的对象,我尝试使用帮助表单 SuperObject 将其编码为 JSON . TLogs = TObjectList; TMyObject = cla
我正在使用 SuperObject 创建和操作 JSON 中的简单层次结构。 我的目标是将一组对象 {"id":..., "name":..., "parent":...} 转换为层次结构。示例: 我
我正在尝试使用 Delphi 7 中的 SuperObject 解析该字符串。 procedure TForm1.btn1Click(Sender: TObject); var obj: ISupe
我在我的一个项目中使用这个 super 对象单元作为 rpc 协议(protocol),在一个远程调用过程中(签名有一个 var Result arg)我想知道如何使用那个 arg... 没有文档吗?
我最近从使用 ULKJson 切换到 SuperObject,我一直在查看软件包附带的示例,并在大多数方面取得了一些进展,但似乎我遇到了一个障碍。更具体地说,我似乎找不到一个示例来展示如何访问数组中的
正如标题所示,我正在尝试使用 Delphi 7 和 SuperObject 库从结构非常简单的 JSON 文件中提取值,但我还没有找到涵盖这个最基本主题的任何示例,并希望一些大师能够提供帮助这里也许可
使用 SuperObject 库时,单个 JSON 对象当前缩进如下: { "name": "value", "int_arr": [ 1,2,3], "obj_arr": [ {
我想从这个 json 中获取所有用户。 { "status": "ok", "next_max_id": "AQAmA1l9NAQXa", "sections": [ {
我使用 SuperObject 库来处理 JSON。 我有这个 JSON(Mozilla FireFox、Chrome 书签文件的一部分): "roots": { "bookmark
我正在使用 Delphi 2010 和 superobject 库。 我已经了解如何解析 json 文件,但我不知道如何创建 json? 算法是: 解析 JSON 并加载到 TStringGrid 添
我是一名优秀的程序员,十分优秀!