@JsonAnySetter,@ JsonAnyGetter与DSL Json(De)/序列化不取值(总是为null)

时间:2016-05-20 06:42:45

标签: json annotations jackson dsl

我使用带有DSL JSON类的自定义序列化在我的POJO类中使用@JsonAnySetter和@JsonAnyGetter,Map已初始化但其他属性始终为null。 我的POJO课程:

  @CompiledJson
  public class Name {

String name;
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

Map<String,String> properties = new HashMap<String,String>();


public Name() {
    // TODO Auto-generated constructor stub
}

@JsonAnyGetter
public Map<String, String> get() {
    return this.properties;
}

@JsonAnySetter
public void set(String key, String value) {
    this.properties.put(key, value);
}

使用DSLJson serialize()和deserialize()方法进行De / Serializing。我也没有看到任何错误,但JSON中的属性仍然为null。我怀疑DSL Json是否支持Jackson注释。 :/

使用DSL Json和Jackson Annotations的

Spring Boot App

更新 我想解析MyClass,它是RootClass的一部分:

 @Compiledjson
 public class RootClass {

private String id;
private List<MyClass> myclass;
private AnotherCLass class2;

//getters and setter here
}

 @CompiledJson
 public class MyClass implements JsonObject {

 private String name;

 private Map<String, String> properties; //want this to behave like Jackson's       @JsonAnySetter/Getter annotation.
 //The implementation of MapConverter serializer you mentioned below.
}

整个代码通过自定义消息阅读器和编写器进行解析。

在发送我的JSON Body时,它会是这样的:

{
"id" : "1234",
"myclass" :
[
{
"name" : "abcd",
//any dynamic properties I want to add will go here
 "test" : "test1",
 "anything" : "anything"
}
],
"class2" : "test5"
}

谢谢:)

1 个答案:

答案 0 :(得分:0)

DSL-JSON不支持这样的get()/ set(字符串,字符串)方法对。 它确实理解Map&lt; String,String&gt;因此,如果您公开properties,它将对此有所帮助。但不是在这种设置中。

从v1.1开始,你有两种方法可以解决这些问题,example project

涵盖了这两个问题。

如果您希望重用现有转换器,您的解决方案可能如下所示:

public static class MyClass {

    private String name;
    private Map<String, String> properties;

    @JsonConverter(target = MyClass.class)
    public static class MyClassConverter {
        public static final JsonReader.ReadObject<MyClass> JSON_READER = new JsonReader.ReadObject<MyClass>() {
            public MyClass read(JsonReader reader) throws IOException {
                Map<String, String> properties = MapConverter.deserialize(reader);
                MyClass result = new MyClass();
                result.name = properties.get("name");
                result.properties = properties;
                return result;
            }
        };
        public static final JsonWriter.WriteObject<MyClass> JSON_WRITER = new JsonWriter.WriteObject<MyClass>() {
            public void write(JsonWriter writer, MyClass value) {
                MapConverter.serialize(value.properties, writer);
            }
        };
    }
}