我有一个图形样式的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 的引用,但这在我的要求中存在两个问题:
- 如果引用早于定义,则引用将被序列化为完整节点数据,而定义只是一个 ID。这不是我想要的。
- 我更喜欢引用属性上更有用的表示,而不仅仅是节点 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发现它们都只支持“从路径获取对象”,但不支持“从两个对象获取路径”(至少我没有找到)。
最后,我的问题是:
- 我可以使用一些库来“从两个对象获取路径”,还是我必须使用大量反射代码自己实现它?
- 对于这个问题的标题,是否有任何现有的简单解决方案?
最佳答案
好吧,这不是一个正确的答案,因为我不完全理解你的问题;但是,“知道”JSON 中有两种寻址机制:
- JSON Pointer ;
- JSON Reference (它使用 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/