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结构不能通过添加注释的属性来修改。
  • 并非我系统中的所有组件和对象都可以访问原始JSON源:一个组件读取文件并使用JSONlib解析并传递反序列化的映射等。
  • 在处理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

    上一篇: style comments in JSON

    下一篇: read JSON straight from an object?