将字段序列化为json

3

我需要向REST服务发送JSON正文。不幸的是,该服务相当陈旧,我需要发送一个包含JSON字符串字段的POJO。因此,它看起来像这样:

class SomeData {
    int id;
    SomePojo jsonField;

    ...
}

所以,应该像这样发送SomeData:
{'id': 1, 'jsonField': some_json_string}

我还没有找到任何Jackson魔法注释来使它工作,我怀疑这可能是由于Java中的类型擦除而无法编写自定义序列化器,因此可能不可行。请问您能否提供任何想法来使其工作或解决该问题?非常感谢!

@Lino 你好,Lino,谢谢你的回答!当然。但这意味着我应该实现自己的自定义序列化器,不是吗? - Dmitry Senkovich
1
查找 org.simple.json,您可以轻松地使用类的 getter 方法将一个类实例创建为 json - Asew
1
我认为Google Gson可能是您正在寻找的。它可以非常轻松地将POJO转换为JSON,反之亦然。它还非常擅长处理嵌套的POJOs。 - Mitch
@Mitch 你好 Mitch,好的,谢谢,我肯定会尝试的,但首先我想保持尽可能简单。 - Dmitry Senkovich
1
@DmitrySenkovich 添加一个id的getter和一个jsonField的getter(它可以返回字符串表示形式以使事情更容易)。然后你只需要在你的类中添加一个方法toJson(),它可以像JSONObject json = new JSONObject(this)一样做些什么。 - Asew
显示剩余3条评论
3个回答

2

你需要实现自己的序列化器,然后可以在ObjectMapper级别进行配置,例如:

ObjectMapper mapper = new ObjectMapper();

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

你可以在这里找到完整的示例。


工作得很好,非常感谢!但是Lino是第一个开始讨论的人,我所能做的就是点赞你的回答:C。 - Dmitry Senkovich

1
当您在Spring上下文中使用Jackson时,可以利用@JsonSerialize注释。
假设您拥有问题中的类,则可以在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());
    }
}

剩下的就为你而生


好像是个解决方案!稍等一下,我来试试! - Dmitry Senkovich
等等,但为什么要使用@JsonDeserialize?o_0 我需要将它序列化为json :) 但我明白了。 - Dmitry Senkovich
哦,那我误解你的意思了,所以你想将该字段序列化为字符串?如果是这样,那就相反了,在你的getter上使用@JsonSerialize注解,并配合相应的序列化器类。 - Lino
更新了答案。 - Lino
很高兴听到这个消息。 - Lino

1
作为要求,我将发布一个关于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":"测试"}

您可以在此处下载Jar文件。

您可以在此处找到完整的文档。

此外,这里链接还有更多的使用示例。


没问题,如果你的类有一个属性是你自己定义的类,比如说 AlsoMyClass,只要这个类也有 getters 方法,它也会被正确地格式化成 json - Asew
问题在于,我无法更改代表字段c的类,并且我必须使用RestTemplate发送它。因此,手动转换为JSON字符串对我来说不是一个选项。 - Dmitry Senkovich
那么,你只需要编写“getPojo()”来返回你的属性的字符串表示形式。它也会起作用。 - Asew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接