3

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

class SomeData {
    int id;
    SomePojo jsonField;

    ...
}

所以 SomeData 应该像这样发送:

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

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

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

4

3 回答 3

2

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

ObjectMapper mapper = new ObjectMapper();

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

您可以在此处找到完整的示例。

于 2017-10-19T08:38:00.617 回答
1

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

其余的确实为您服务

于 2017-10-19T08:42:28.267 回答
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 。

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

还有这个链接以获得更多使用示例。

于 2017-10-19T09:18:24.610 回答