Ric*_*uen 5 java json comments json-lib
我正在处理操纵"轻松"JSON数据的系统,其中包括shell样式的#行注释:
[
{
# Batman
"first-name": "Bruce",
"last-name": "Wayne"
},
{
# Superman
"first-name": "Clark",
"last-name": "Kent"
}
]
Run Code Online (Sandbox Code Playgroud)
我正在研究的系统部分使用json-lib - 我很惊讶地发现它容忍shell样式的注释 - 来解析JSON输入.
我需要从这些注释中提取一些额外的注释,但json-lib似乎只是放弃它们而不提供用于读取它们的API:
JSONObject map = (JSONObject)JSONSerializer.toJSON("{\n"+
" # Batman\n" + // 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
*/
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为注释不是JSON规范的一部分,我很幸运json-lib在解析它们时不会窒息.
值得注意的是
在处理JSON输入时如何读取和解析这些注释?是否有一个库可以让我阅读它们并将它们与它们在JSON中的位置联系起来 - 我可以轻松地将Batman评论连接到"Bruce Wayne"条目吗?
我目前正在使用json-lib,但我愿意调查其他JSON库并同样开放使用扩展JSON的其他语言,例如YAML - 但我不确定这些工具是否允许我阅读和处理我的意见中的评论.
编辑(2021 年 5 月 27 日):
我选择做的是为这个非标准版本的 JSON 编写一个自定义 JSON 解析器。它支持您问题中给出的 shell 注释,但仅在 JSON 对象的第一个键之前:
(前面是 C# 版本;预计也将提供 Java 版本。它依赖于我的简洁二进制对象表示库,在 NuGet 中称为 PeterO.Cbor,在中央存储库中称为 com.upokecenter/cbor。)
事实上,您的要求之一是“不能通过添加注释属性来修改 JSON 结构”。这意味着注释必须以其他方式与 JSON 对象关联。幸运的是,名为 JSON Pointer 的规范最近作为 RFC 6901 发布。JSON Pointer 是一个引用另一个 JSON 对象中的 JSON 对象的字符串。这就是为什么解析器包含一种通过名为 的方法获取注释及其关联的 JSON 指针的原因JSONWithComments.FromJSONStringWithPointers。JSONPointer.cs是我自己的 JSON 指针规范的实现。
使用示例:
dict=new Dictionary<string, string>();
str="{\"f\":[\n {\n # B\t \tA C\n # Dm\n\"a\":1,\n\"b\":2\n},{\n #" +
"\u0020Sm\n\"a\":3,\n\"b\":4\n}\n]}";
obj = JSONWithComments.FromJSONString(str);
Console.WriteLine(obj);
obj = JSONWithComments.FromJSONStringWithPointers(str, dict);
// Get the comment and its associated JSON pointer
foreach(string key in dict.Keys) {
Console.WriteLine(key);
Console.WriteLine(dict[key]);
// Get the pointed-to object
Console.WriteLine(JSONPointer.GetObject(obj,dict[key]));
}
// Output the object
Console.WriteLine(obj);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
408 次 |
| 最近记录: |