SDJSONPrettyPrint
将兼容 Foundation 的对象树转换成 JSON 字符串。它不是设计成快速且可生产的 JSON 序列化器,对于这个目的,你可能需要 JSONKit。 SDJSONPrettyPrint
专注于生成尽可能人性化的 JSON,您可以用它来进行日志记录或调试。
目前有大量的Objective-C JSON 序列化器,包括一个非常好的内置序列化器,它会产生完全合法的 JSON 字符串,主要是为机器使用。这些解决方案中的大部分忽略了——或者有其他有限的解决方案——为人类阅读的输出生产。这对于日志记录来说是一项重要特性,因为在开发复杂 API 的庞大系统时,在开发过程中,将会进行数千个 API 请求和响应。其中许多将由程序员手动检查,以确保应用程序正确地与 API 交互。本项目旨在生成便于阅读的 JSON 输出,格式优雅,且以最不易让人沮丧的方式展示数据。
请考虑以下经过机器格式化的 JSON 示例
{"function":null,"numbers":[4,8,15,16,23,42],"y_index":2,"x_index":12,"z_index":5,"arcs":[{"p2":[22.1,50],"p1":[10.5,15.5],"radius":5},{"p2":[23.1,40],"p1":[11.5,15.5],"radius":10},{"p2":[23.1,30],"p1":[12.5,15.5],"radius":3},{"p2":[24.1,20],"p1":[13.5,15.5],"radius":2},{"p2":[25.1,10],"p1":[14.5,15.5],"radius":8},{"p2":[26.1,0],"p1":[15.5,15.5],"radius":2}],"label":"my label"}
如果您通过 NSJSONSerialization
并且启用了 NSJSONWritingPrettyPrinted
来运行此操作,它将产生
{
"function" : null,
"numbers" : [
4,
8,
15,
16,
23,
42
],
"y_index" : 2,
"x_index" : 12,
"z_index" : 5,
"arcs" : [
{
"p2" : [
22.1,
50
],
"p1" : [
10.5,
15.5
],
"radius" : 5
},
{
"p2" : [
23.1,
40
],
"p1" : [
11.5,
15.5
],
"radius" : 10
},
{
"p2" : [
23.1,
30
],
"p1" : [
12.5,
15.5
],
"radius" : 3
},
{
"p2" : [
24.1,
20
],
"p1" : [
13.5,
15.5
],
"radius" : 2
},
{
"p2" : [
25.1,
10
],
"p1" : [
14.5,
15.5
],
"radius" : 8
},
{
"p2" : [
26.1,
0
],
"p1" : [
15.5,
15.5
],
"radius" : 2
}
],
"label" : "my label"
}
这略微好了一些,但实际上它只是添加了一堆空白来填充垂直空间。它会无条件地为数组中的每个元素添加新行,并且打印 JSON 对象中的键的顺序似乎是相当随意的。令人惊讶的是,“label”键位于巨大的对象数组“arcs”之下,这意味着它很容易被忽略。
JSONKit
是一个备受尊敬的 JSON 解析和序列化库,被许多应用程序在生产中使用。类似于 NSJSONSerialization
,它有一个美化打印模式。当通过它运行此示例 JSON 时,它将产生
{
"arcs": [
{
"p1": [
10.5,
15.5
],
"p2": [
22.100000000000001,
50
],
"radius": 5
},
{
"p1": [
11.5,
15.5
],
"p2": [
23.100000000000001,
40
],
"radius": 10
},
{
"p1": [
12.5,
15.5
],
"p2": [
23.100000000000001,
30
],
"radius": 3
},
{
"p1": [
13.5,
15.5
],
"p2": [
24.100000000000001,
20
],
"radius": 2
},
{
"p1": [
14.5,
15.5
],
"p2": [
25.100000000000001,
10
],
"radius": 8
},
{
"p1": [
15.5,
15.5
],
"p2": [
26.100000000000001,
0
],
"radius": 2
}
],
"function": null,
"label": "my label",
"numbers": [
4,
8,
15,
16,
23,
42
],
"x_index": 12,
"y_index": 2,
"z_index": 5
}
这略微好了一些,因为它至少按可预测的方式——虽然有点无用——对键进行了排序:字母顺序。它仍然存在无选择地添加新行并在简单值之前放置具有大型 JSON 结构的大型值的问题,这使得数据容易忽视。
以下是从 SDJSONPrettyPrint
生成的输出。
{
"label": "my label",
"x_index": 12,
"y_index": 2,
"z_index": 5,
"numbers": [4, 8, 15, 16, 23, 42],
"function": null,
"arcs": [
{
"radius": 5,
"p1": [10.5, 15.5],
"p2": [22.1, 50]
},
{
"radius": 10,
"p1": [11.5, 15.5],
"p2": [23.1, 40]
},
{
"radius": 3,
"p1": [12.5, 15.5],
"p2": [23.1, 30]
},
{
"radius": 2,
"p1": [13.5, 15.5],
"p2": [24.1, 20]
},
{
"radius": 8,
"p1": [14.5, 15.5],
"p2": [25.1, 10]
},
{
"radius": 2,
"p1": [15.5, 15.5],
"p2": [26.1, 0]
}
]
}
非常慢。
SDJSONPrettyPrint
SDJSONPrettyPrint
NSJSONSerialization
进行此项操作。实际上,SDJSONPrettyPrint
还使用 NSJSONSerialization
对 JSON 对象进行内部正确性检查,所以您绝对不 比 使用这个类在这方面更优越。推荐:CocoaPods。
pod 'SDJSONPrettyPrint'
手动。将 SDJSONPrettyPrint.h
和 SDJSONPrettyPrint.m
文件复制到您的项目中。它不会打扰其他东西,不需要除 Foundation
之外的其他框架,也不实现任何分类。
SDJSONPrettyPrint
在 MIT 许可下发布。
版权所有 (c) 2013, Tyrone Trevorrow
在此,免费许可任何人获得此软件及其相关文档文件(“软件”),在不受限制的情况下处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向提供软件的人员做上述操作,但受以下条件约束
上述版权声明和本许可声明应包含在所有副本或主要部分中的软件中。
软件按“原样”提供,不提供任何形式的质量保证,无论明示或暗示的,包括但不限于适销性、适用于特定用途和非侵权性保证。在无论任何情况下,无论因合同、侵权或其他责任而引起的索赔、损害或其他责任,作者或版权持有者均不对任何索赔、损害或其他责任承担责任,无论是因软件或其使用或以其他方式产生。