json 将变量字段序列化为字符串
json serialization with a variable field as a string
我有一个正在解组 REST 响应的 pojo。其中一个字段 ("variable value") 只是一个 Json 可变元素(可以是任何形式)。
有没有办法告诉它在所有情况下都将字段视为纯字符串,而不是尝试反序列化为对象?
这是一个 json 对象("variable value" 可以是任何形式):
{"id":1, "variable value": {"name":"one", "age": 22, "data":{"key":"value"}}}
我想使用 gson
将此 json 保存为 class 对象
public class SomeCommand {
private Long id;
private String data;
}
听起来您想解析给定的 JSON 字符串以将 变量值 转换为 String
对象。您可以通过创建 2 类 - SomeCommandOriginal
和 SomeCommand
来实现此目的,如下所示:
首先,将JSON字符串转换为SomeCommandOriginal
,将变量值的值映射到JsonNode
。
class SomeCommandOriginal {
private Long id;
@JsonProperty("variable value")
private JsonNode variableValue;
//general getters and setters
}
class SomeCommand {
private Long id;
private String data;
public SomeCommand(SomeCommandOriginal someCommandOriginal) {
super();
this.id = someCommandOriginal.id;
this.data = someCommandOriginal.variableValue.toString();
}
//general getters and setters
}
其次,初始化SomeCommand
的一个实例并将someCommandOriginal
作为自定义构造函数的参数传递:
ObjectMapper mapper = new ObjectMapper();
SomeCommandOriginal someCommandOriginal = mapper.readValue(jsonStr, SomeCommandOriginal.class);
SomeCommand someCommand = new SomeCommand(someCommandOriginal);
System.out.println(someCommand.getData());
控制台输出:
{"name":"one", "age": 22, "data":{"key":"value"}}
已更新
如果你使用的是Gson
,只需修改variableValue的数据类型为JsonObject
,然后切换为@SerializedName
注解即可:
class SomeCommandOriginal {
private Long id;
@SerializedName("variable value")
private JsonObject variableValue;
//general getters and setters
}
然后你也可以得到相同的结果:
Gson gson = new Gson();
SomeCommandOriginal someCommandOriginal = gson.fromJson(jsonStr, SomeCommandOriginal.class);
SomeCommand someCommand = new SomeCommand(someCommandOriginal);
System.out.println(someCommand.getData());
我有一个正在解组 REST 响应的 pojo。其中一个字段 ("variable value") 只是一个 Json 可变元素(可以是任何形式)。 有没有办法告诉它在所有情况下都将字段视为纯字符串,而不是尝试反序列化为对象?
这是一个 json 对象("variable value" 可以是任何形式):
{"id":1, "variable value": {"name":"one", "age": 22, "data":{"key":"value"}}}
我想使用 gson
将此 json 保存为 class 对象public class SomeCommand {
private Long id;
private String data;
}
听起来您想解析给定的 JSON 字符串以将 变量值 转换为 String
对象。您可以通过创建 2 类 - SomeCommandOriginal
和 SomeCommand
来实现此目的,如下所示:
首先,将JSON字符串转换为SomeCommandOriginal
,将变量值的值映射到JsonNode
。
class SomeCommandOriginal {
private Long id;
@JsonProperty("variable value")
private JsonNode variableValue;
//general getters and setters
}
class SomeCommand {
private Long id;
private String data;
public SomeCommand(SomeCommandOriginal someCommandOriginal) {
super();
this.id = someCommandOriginal.id;
this.data = someCommandOriginal.variableValue.toString();
}
//general getters and setters
}
其次,初始化SomeCommand
的一个实例并将someCommandOriginal
作为自定义构造函数的参数传递:
ObjectMapper mapper = new ObjectMapper();
SomeCommandOriginal someCommandOriginal = mapper.readValue(jsonStr, SomeCommandOriginal.class);
SomeCommand someCommand = new SomeCommand(someCommandOriginal);
System.out.println(someCommand.getData());
控制台输出:
{"name":"one", "age": 22, "data":{"key":"value"}}
已更新
如果你使用的是Gson
,只需修改variableValue的数据类型为JsonObject
,然后切换为@SerializedName
注解即可:
class SomeCommandOriginal {
private Long id;
@SerializedName("variable value")
private JsonObject variableValue;
//general getters and setters
}
然后你也可以得到相同的结果:
Gson gson = new Gson();
SomeCommandOriginal someCommandOriginal = gson.fromJson(jsonStr, SomeCommandOriginal.class);
SomeCommand someCommand = new SomeCommand(someCommandOriginal);
System.out.println(someCommand.getData());