JSON风格的评论
我正在处理的系统操纵“轻松”的JSON数据,其中包括壳式风格的#
行评论:
[
{
# Batman
"first-name": "Bruce",
"last-name": "Wayne"
},
{
# Superman
"first-name": "Clark",
"last-name": "Kent"
}
]
我正在使用的系统的一部分使用json-lib - 我惊讶地发现它容忍shell风格的注释 - 解析JSON输入。
我需要从这些注释中提取一些额外的注释,但是json-lib似乎只是放弃它们而没有提供读取它们的API:
JSONObject map = (JSONObject)JSONSerializer.toJSON("{n"+
" # Batmann" + // note the shell-style # comment
" "first-name": "Bruce",n" +
" "last-name": "Wayne"n" +
"}");
System.out.println(map.toString());
/* <<'OUTPUT'
* {"first-name":"Bruce","last-name":"Wayne"}
* OUTPUT
* note the absence of the shell-style comment
*/
这是有道理的,因为注释不是JSON规范的一部分,我很幸运,当解析它们时,json-lib不会窒息。
注意:
在处理JSON输入时如何读取和解析这些注释? 有没有一个图书馆可以让我阅读它们,并将它们与JSON中的位置联系起来 - 我可以轻松地将Batman
评论与“Bruce Wayne”条目连接起来吗?
我目前正在使用json-lib,但我打算调查其他JSON库,并同样打开使用扩展JSON的其他语言,如YAML - 但我不确定这些工具是否允许我读取和处理在我的意见中的评论。
我选择做的是修改公共域JSON.org库以支持shell注释并向JSON对象添加注释,正如我在此GitHub中所做的一样:
https://gist.github.com/peteroupc/5529464
使用示例:
JSONObject obj=new JSONObject("{ # Commentn"+
""first-key":"first-value",n"+
""second-key":"second-value" }",
JSONObject.OPTION_SHELL_COMMENTS | // Support SHELL-style comments
JSONObject.OPTION_ADD_COMMENTS // Incorporate comments in the JSON object
);
System.out.println(obj); // Output the JSON object
示例输出。 请注意,该注释出现在名为“@comment”的键中。
{"second-key":"second-value","@comment":"Comment","first-key":"first-value"}
但是你的一个要求是“不能通过为注释添加属性来修改JSON结构”。 这意味着评论必须以其他方式与JSON对象相关联。 幸运的是,名为JSON指针的规范最近作为RFC 6901发布。JSON指针是指另一个JSON对象内的JSON对象的字符串。 因此,需要执行其他步骤:使用“@comment”键查找子对象,删除键,并创建JSON指针到注释的映射。
这由下面的代码说明。
// Objects with comments associated with them will
// now contain an "@comment" key; get the JSON Pointers
// (RFC6901) to these objects and remove the "@comment" keys.
Map<String,Object> pointers=JSONPointer.getPointersWithKeyAndRemove(obj,"@comment");
// For each JSON Pointer, get its corresponding object.
// They will always be JSONObjects.
for(String pointer : pointers.keySet()){
JSONObject subobj=(JSONObject)JSONPointer.getObject(obj,pointer);
System.out.println(subobj); // Output the object
System.out.println(pointers.get(pointer)); // Output the key's value
}
示例输出:
{"second-key":"second-value","first-key":"first-value"}
Comment
由于JSON指针是新的,我写了自己的实现并将其包含在GitHub的要点中。
这里有更多的例子来澄清。
给定这个JSON数组(在这个例子中使用JSONArray而不是JSONObject):
[{ # foo
"foo-key":"foo-value"},
{ # This is a
# quite long comment.
"bar-key":"bar-value"}]
结果是:
{"foo-key":"foo-value"}
foo
{"bar-key":"bar-value"}
This is a quite long comment.
结果,多条评论被合并为一条评论。 但是,鉴于这个JSON数组:
[{ # foo
"foo-key":"foo-value"},
{ # This is a
# quite long comment.
"bar-key":"bar-value"
# This is another comment.
}]
结果是:
{"foo-key":"foo-value"}
foo
{"bar-key":"bar-value"}
This is another comment.
因此,“条形”对象上多处发生的多条评论不会合并。
其他系统使用相同的JSON,并且注释需要对它们透明,所以JSON结构不能通过为注释添加属性来修改
在消息中使用注释来在系统之间传递数据似乎不是一种好的做法。 。 例如XML不支持。
为什么不简单地将重要的“评论”作为数据? 这就是其他系统使用它的原因。 :^)
链接地址: http://www.djcxy.com/p/20125.html