将字段序列化为 json
Serializing a field as json
我需要将 JSON 正文发送到 REST 服务。不幸的是,服务很旧,我需要发送一个包含 JSON 字符串字段的 POJO。所以它看起来像这样:
class SomeData {
int id;
SomePojo jsonField;
...
}
所以 SomeData 应该这样发送:
{'id': 1, 'jsonField': some_json_string}
我还没有找到任何 Jackson 魔术注释来让它工作,我怀疑它是否可以以某种方式制作,因为 Java 中的类型擦除并且可能无法编写自定义序列化程序为此目的,但我不确定。
您能否建议我如何让它工作或解决问题?非常感谢您!
您需要实现自己的序列化器,然后可以在 ObjectMapper
级别配置它,例如:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(SomeData.class, new SomeDataSerialiser());
mapper.registerModule(module);
您可以找到完整的示例 here。
当您在 Spring 上下文中使用 Jackson 时,您可以使用 @JsonSerialize
-Annotation
假设您的问题中有 类,那么您可以将上述注释放在 getter:
public class SomeData {
int id;
SomePojo jsonField;
@JsonSerialize(using = PojoSerializer.class)
public SomePojo getJsonField(){
return jsonField;
}
}
然后创建 PojoSerializer
:
public class PojoSerializer extends JsonSerializer<SomePojo>{
@Override
public void serialize( SomePojo pojo, JsonGenerator jsonGenerator, SerializerProvider serializerProvider ) throws IOException{
jsonGenerator.writeString(pojo.getSomeString());
}
}
剩下的 spring 为您服务
根据要求,我将 post 一个 org.json
的简单示例。
Class 样本:
import org.json.*;
public class MyClass {
private int id;
private String randomString;
public MyClass(int id_, String randomString_){
this.id = id_;
this.randomString = randomString_;
}
public int getId() {
return id;
}
public String getRandomString() {
return randomString;
}
//Uses the getter to generate a JSon representation of the class
public JSONObject toJson(){
return new JSONObject(this);
}
}
主线:
public static void main(String[] args) {
MyClass test = new MyClass(1, "Test");
System.out.println(test.toJson().toString());
}
输出:{"id":1,"randomString":"Test"}
您可以下载 Jar here。
您可以找到完整的文档 here。
还有这个 link 更多使用示例。
我需要将 JSON 正文发送到 REST 服务。不幸的是,服务很旧,我需要发送一个包含 JSON 字符串字段的 POJO。所以它看起来像这样:
class SomeData {
int id;
SomePojo jsonField;
...
}
所以 SomeData 应该这样发送:
{'id': 1, 'jsonField': some_json_string}
我还没有找到任何 Jackson 魔术注释来让它工作,我怀疑它是否可以以某种方式制作,因为 Java 中的类型擦除并且可能无法编写自定义序列化程序为此目的,但我不确定。
您能否建议我如何让它工作或解决问题?非常感谢您!
您需要实现自己的序列化器,然后可以在 ObjectMapper
级别配置它,例如:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(SomeData.class, new SomeDataSerialiser());
mapper.registerModule(module);
您可以找到完整的示例 here。
当您在 Spring 上下文中使用 Jackson 时,您可以使用 @JsonSerialize
-Annotation
假设您的问题中有 类,那么您可以将上述注释放在 getter:
public class SomeData {
int id;
SomePojo jsonField;
@JsonSerialize(using = PojoSerializer.class)
public SomePojo getJsonField(){
return jsonField;
}
}
然后创建 PojoSerializer
:
public class PojoSerializer extends JsonSerializer<SomePojo>{
@Override
public void serialize( SomePojo pojo, JsonGenerator jsonGenerator, SerializerProvider serializerProvider ) throws IOException{
jsonGenerator.writeString(pojo.getSomeString());
}
}
剩下的 spring 为您服务
根据要求,我将 post 一个 org.json
的简单示例。
Class 样本:
import org.json.*;
public class MyClass {
private int id;
private String randomString;
public MyClass(int id_, String randomString_){
this.id = id_;
this.randomString = randomString_;
}
public int getId() {
return id;
}
public String getRandomString() {
return randomString;
}
//Uses the getter to generate a JSon representation of the class
public JSONObject toJson(){
return new JSONObject(this);
}
}
主线:
public static void main(String[] args) {
MyClass test = new MyClass(1, "Test");
System.out.println(test.toJson().toString());
}
输出:{"id":1,"randomString":"Test"}
您可以下载 Jar here。
您可以找到完整的文档 here。
还有这个 link 更多使用示例。