@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);
}
};
}
}
我在我的 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) 方法对。
它确实理解 Mapproperties
它会在上面工作。但不是在这种设置中。
从 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);
}
};
}
}