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

标签 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 不必要地大。
Jackson 有设置,它可以将变量引用序列化为目标对象的 id 的引用,但这在我的要求中存在两个问题:

  1. 如果引用早于定义,则引用将被序列化为完整节点数据,而定义只是一个 ID。这不是我想要的。
  2. 我更喜欢引用属性上更有用的表示,而不仅仅是节点 ID。 -- 这是从根开始的路径,类似于 XPath 或 JSONPath。

因此,我尝试在 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 的库,例如JXPath , Java JsonPath发现它们都只支持“从路径获取对象”,但不支持“从两个对象获取路径”(至少我没有找到)。

最后,我的问题是:

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

最佳答案

好吧,这不是一个正确的答案,因为我不完全理解你的问题;但是,“知道”JSON 中有两种寻址机制:

由于您的引用看起来只是您文档的本地引用(但我可能再次被误导,我不完全理解您的问题),那么您可以使用一个自定义属性,该属性的值是一个字符串,表示一个 JSON 指针:

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

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

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

但是:草案提到,如果您使用 JSON 引用,则其他对象成员将被忽略;所以这可能也不是你想要的......

只是我的 .02 比特币。

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

关于Java对象转json,如何通过路径序列化引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23630291/

相关文章:

java - 为什么我的应用程序每次运行时都会崩溃?没有错误

Python:按 mm/dd/yyyy 日期对 JSON 列表进行排序

json - Swift JSONDecoder typeMismatch 错误

c# - 在使用 JSON.NET 反序列化之前从 JSON 中删除非法字符

C++ XML 数据绑定(bind)

java - Java JUnit 代码中 new 运算符之后的代码块

java - 模拟 : mock method call with parameters by reflection

java - 在vlcj MediaPlayer上添加透明Swing组件?

json - Swift 从 Dictionary of Dictionary 中删除 optional

Java - 未找到类异常