我有一个图形样式的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作为参考,但这在我的要求中存在两个问题:
所以我正在尝试在类型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。 JXPath,Java JsonPath并发现它们都只支持“从路径获取对象”,但没有“从两个对象获取路径”(至少我没有找到)。
最后,我的问题是:
答案 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指针实现。