Java对象为json,如何通过路径序列化引用

时间:2014-05-13 11:41:03

标签: java json serialization xpath jackson

我有一个图形样式的Java对象,实际上它是一个Abstract syntax tree,但有一些参考链接,所以结构就是图形。

class Root {
    //A list of variable definition
    List<Variable> variables;
}

class Variable {
    String name;
    //the expression to define this variable
    Expression exp;
}

class Expression {
    //...some other nodes to make up this expression
}

//...Many node classes

//one of the nodes making up Expression
class SomeNodeInExpression {
    //refer to another variable which is inside the same root
    Variable referring; 
}

更新引用位于同一个根目录中,因此无需引用其他文档

现在要求将Root对象序列化为JSON。

默认情况下,许多JSON库每次引用时都会序列化一个变量。我不想要它,因为它会导致JSON不必要地大 杰克逊的设置可以将Variable referring序列化为目标对象的id作为参考,但这在我的要求中存在两个问题:

  1. 如果引用早于定义,则引用将序列化为完整节点数据,而definition只是一个ID。这不是我想要的。
  2. 我更喜欢在引用属性上使用更多有用的表示,而不仅仅是节点ID。 - 这是一个来自Root的路径,比如XPath或JSONPath。
  3. 所以我正在尝试在类型SomeNodeInExpression上自定义JacksonSerializer并获得以下内容:

    class SomeNodeInExpressionSerializer extends JsonSerializer<SomeNodeInExpression> {
        Root root;
        @Override
        public void serialize(SomeNodeInExpression value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
            jgen.writeStringField("referingPath", createReferingPath(root, value));
        }
    
        private String createReferingPath(Root root, SomeNodeInExpression value){
            //Don't know what to do now
        }
    }
    

    然后我研究了一些类似Java XPath的库,e.x。 JXPathJava JsonPath并发现它们都只支持“从路径获取对象”,但没有“从两个对象获取路径”(至少我没有找到)。

    最后,我的问题是:

    1. 我可以通过使用一些库来“从两个对象获取路径”,或者我必须使用大量反射代码自己实现它?
    2. 这个问题的标题是否有现成的简单解决方案?

1 个答案:

答案 0 :(得分:0)

好的,这不是一个正确的答案,因为我不完全理解你的问题;然而,&#34;知道&#34;您在JSON中有两种寻址机制:

由于你的引用看起来只是你文档的本地(但我可能会被误导,我不能完全理解你的问题)然后你可以使用一个自定义属性,其值是一个字符串,代表一个JSON指针:

{ "ptr": "/path/from/root" }

否则,如果您必须引用其他文档,则必须拥有该文档的URI并使用JSON Reference,如下所示:

{ "$ref": "uri://to/other.json#/path/into/that/other.json" }

但是:草案提到如果你使用JSON Reference,那么其他对象成员应该被忽略;所以这可能不是你想要的......

只是我的.02比特币。

请注意,如果您有兴趣,我有一个JSON指针实现。