@JsonAnySetter, @JsonAnyGetter with DSL Json (De)/Serialization not taking values(always null)

@JsonAnySetter, @JsonAnyGetter with DSL Json (De)/Serialization not taking values(always null)

我在我的 POJO class 中使用 @JsonAnySetter 和 @JsonAnyGetter class 使用我的 DSL 自定义序列化 JSON class,地图是已初始化,但其他属性始终为空。 我的 POJO class:

  @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);
}

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

Spring 使用 DSL Json 和 Jackson 注释启动应用程序

更新 我想解析 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.
}

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

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

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

谢谢:)

DSL-JSON 不支持这样的 get()/set(string, string) 方法对。 它确实理解 Map 所以如果你公开 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);
            }
        };
    }
}