杰克逊:json架构引用其他架构,这可以被禁用吗?

时间:2014-10-03 19:30:24

标签: java json jsonschema jackson-modules

当我使用Jackson Json-Schema-Module时,我的模式是使用彼此指向的引用生成的。

考虑这个架构:

这是POJO1

中的属性对象
    "myObject" : {
     "type" : "object",
     "id": "urn:jsonschema:package:myObject"
     "properties": {
          "property1" : {
             "type" : "string"
         },
          "property2" : {
             "type" : "string"
         }
    }
 }

我在POJO2中有相同的属性对象,当两个模式生成时,我在POJO2中得到以下内容:

  "myObject" : {
     "type" : "object",
     "$ref": "urn:jsonschema:package:myObject"
  }

但我希望POJO2'a架构中的这个属性与POJO1架构中的相同,我不想要引用。可以禁用吗?或者有解决方法吗?

这是我使用的代码:

for (Class clazz : classes) {

    ObjectMapper m = new ObjectMapper();
    SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
    m.acceptJsonFormatVisitor(m.constructType(clazz), visitor);
    JsonSchema jsonSchema = visitor.finalSchema();
    m.write(new File("json/" + clazz.getSimpleName() + ".json"), jsonSchema);

}

起初我认为如果为每个模式构造使用不同的ObjectMapper实例,我会得到我想要的东西,但事实并非如此,显然存在某种缓存,我对这些东西的了解不够深入到右边结论

谢谢!

4 个答案:

答案 0 :(得分:3)

You can override VisitorContext

SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();
visitor.setVisitorContext(new VisitorContext(){
        @Override
        public String addSeenSchemaUri(JavaType aSeenSchema) {
            return javaTypeToUrn(aSeenSchema);
        }
    });

答案 1 :(得分:2)

您可以简单地覆盖hashset并使用java反射设置它:

Field f = visitorContext.getClass().getDeclaredField("seenSchemas");
      f.setAccessible(true);
      f.set(visitorContext, dummyHashSet);

答案 2 :(得分:0)

我想你可以查一下这句话:

m.acceptJsonFormatVisitor(m.constructType(clazz), visitor);

什么类的课程是clazz?我不确定,但是你可以尝试类似的东西:

myclass.class

答案 3 :(得分:0)

有一个VisitorContext类存储引用,它的方法是静态的,所以我通过更改这个类的源代码解决了这个问题。