Java 将字段序列化为json

Java 将字段序列化为json,java,json,jackson,resttemplate,jackson-databind,Java,Json,Jackson,Resttemplate,Jackson Databind,我需要向REST服务发送一个JSON正文。不幸的是,该服务非常旧,我需要发送一个包含JSON字符串字段的POJO。看起来是这样的: class SomeData { int id; SomePojo jsonField; ... } {'id': 1, 'jsonField': some_json_string} 所以一些数据应该像这样发送: class SomeData { int id; SomePojo jsonField; ...

我需要向REST服务发送一个JSON正文。不幸的是,该服务非常旧,我需要发送一个包含JSON字符串字段的POJO。看起来是这样的:

class SomeData {
    int id;
    SomePojo jsonField;

    ...
}
{'id': 1, 'jsonField': some_json_string}
所以一些数据应该像这样发送:

class SomeData {
    int id;
    SomePojo jsonField;

    ...
}
{'id': 1, 'jsonField': some_json_string}
我还没有发现任何Jackson magic注释可以使它工作,我怀疑它是否能够以某种方式工作,因为Java中的类型擦除,可能无法为此编写自定义序列化程序,但我不确定


你能建议我如何使它工作或解决这个问题吗?提前非常感谢

您需要实现自己的serialiser,然后可以在
ObjectMapper
级别对其进行配置,例如:

ObjectMapper mapper = new ObjectMapper();

SimpleModule module = new SimpleModule();
module.addSerializer(SomeData.class, new SomeDataSerialiser());
mapper.registerModule(module);

您可以找到完整的示例。

在Spring上下文中使用Jackson时,可以使用-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());
    }
}
公共类PojoSerializer扩展JsonSerializer{
@凌驾
public void serialize(SomePojo pojo、jsonggenerator、jsonggenerator、SerializerProvider SerializerProvider)引发IOException{
writeString(pojo.getSomeString());
}
}

剩下的部分将为您提供

正如所问,我将发布一个简单的
org.json
示例

类别样本:

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

您可以找到完整的文档


这也是更多的用法示例

@Lino嗨,Lino,谢谢你的回答!当然但这意味着我应该实现自己的自定义序列化程序,不是吗?查找
org.simple.json
您可以使用类getter从类实例轻松创建
json
。我认为google gson可能就是您要找的。它可以很容易地将POJO转换为JSON,反之亦然。它在处理嵌套POJO方面也很好。@Asew Hi,谢谢你的建议,但是如何用这种方式对字段进行O序列化?@DmitrySenkovich为id添加一个getter,为jsonField添加一个getter(这可以返回它的字符串表示形式,以使事情更简单)。然后,您应该在类中添加一个方法
toJson()
,该方法执行类似于
jsonobjectjson=newjsonobject的操作(这)
似乎是一个解决方案!请稍等,我试试看!等等,但是为什么
@JsonDeserialize
?o_0我需要将它序列化为json:)但是我得到了一个ideaoh,然后我理解错了,所以你想将字段序列化为字符串?如果是这样,那正好相反,getter上的@JsonSerialize和相应的序列化程序类更新了答案很高兴听到这个消息,太好了,谢谢!但是Lino是第一个开始讨论的人,我所能做的就是让你回答:CNo问题,同样,如果你的类作为你的类的一个属性,比如说,
Alsmyclass
,只要这个类也作为getter,它也会被正确地格式化成
json
。但是,问题在这里,我不能改变这个类,表示字段:c,我必须使用
restemplate
发送它。因此,我无法手动转换为json strong。那么,您只需编写“getPojo()”来返回属性的字符串表示形式。它也会起作用。