【问题标题】:Serializing a field as json将字段序列化为 json
【发布时间】:2018-03-31 05:50:52
【问题描述】:

我需要将 JSON 正文发送到 REST 服务。不幸的是,服务很旧,我需要发送一个 POJO,包含 JSON 字符串字段。所以它看起来像这样:

class SomeData {
    int id;
    SomePojo jsonField;

    ...
}

所以 SomeData 应该像这样发送:

{'id': 1, 'jsonField': some_json_string}

我还没有找到任何 Jackson 魔术注释来使它工作,我怀疑它可以以某种方式制作,因为 Java 中的类型擦除并且可能无法为此目的编写自定义序列化程序,但我'我不确定。

您能否建议我如何使其工作或解决该问题的任何想法?非常感谢您!

【问题讨论】:

  • @Lino 嗨 Lino,感谢您的回答!当然。但这意味着我应该实现自己的自定义序列化程序,不是吗?
  • 查找org.simple.json,您可以使用类getter轻松地从类实例中创建json。
  • 我认为 google gson 可能是您正在寻找的。它可以很容易地将 POJO 转换为 JSON,反之亦然。它在处理嵌套 POJO 方面也非常出色。
  • @Asew 您好,感谢您的建议,但是 O 如何以这种方式序列化字段?
  • @DmitrySenkovich 为 id 添加一个 getter,为 jsonField 添加一个 getter(它可以返回它的字符串表示以使事情变得更容易)。然后你应该在你的类中添加一个方法toJson() 来做类似JSONObject json = new JSONObject(this)

标签: java json jackson resttemplate jackson-databind


【解决方案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":"Test"}

您可以下载 Jar here。

您可以找到完整的文档here。

还有这个link 以获取更多使用示例。

【讨论】:

  • 没问题,另外,如果你的类作为你的一个类的属性,比如说AlsoMyClass,只要这个类也是getter,它也会正确格式化为@987654329 @.
  • 问题出在这里,但是,我无法更改类,代表字段:c,我必须使用RestTemplate 发送它。所以我不能手动转换为强 json
  • 那么,您只需编写“getPojo()”代码即可返回属性的字符串表示形式。它也会起作用。
【解决方案2】:

在 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());
    }
}

其余的都会为您服务

【讨论】:

  • 似乎是一个解决方案!等一下,我试试看!
  • 等等,但是为什么@JsonDeserialize?o_0 我需要将它序列化为json :) 但我明白了
  • 哦,那我理解错了,所以你想将字段序列化为字符串吗?如果是这样,则相反,您的 getter 上的 @JsonSerialize 与相应的序列化程序类
  • 更新了答案
  • 很高兴听到这个消息
【解决方案3】:

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

ObjectMapper mapper = new ObjectMapper();

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

你可以找到完整的例子here。

【讨论】:

  • 工作,太好了,谢谢!但是Lino是第一个开始讨论的,我能做的就是让你回答:C
猜你喜欢
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 2020-03-05
相关资源
最近更新 更多