【问题标题】:How to customize json wrapped key for class if I am not able to mark that class with annotation JsonTypeInfo?如果我无法使用注释 JsonTypeInfo 标记该类,如何为类自定义 json 包装键?
【发布时间】:2018-10-29 12:50:00
【问题描述】:

我有这样的代码:

import org.codehaus.jackson.map.*;

public class MyPojo {
    int id;
    public int getId()
    { return this.id; }

    public void setId(int id)
    { this.id = id; }

    public static void main(String[] args) throws Exception {
        MyPojo mp = new MyPojo();
        mp.setId(4);
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);        
        System.out.println(mapper.writeValueAsString(mp));
    }
}

预期效果:

{"MyPojo":{"id":4}}

但我想自定义该名称。我无法用@JsonTypeInfo 标记MyPojo,因为我从图书馆学习这门课。

杰克逊有办法吗?

【问题讨论】:

  • 尝试将您的MyPojo 子类化并将注释添加到子类中?
  • @Usagi Miyamoto,这是个好主意,但我不确定我们是否可以这样做,因为我们的类是通过 thrift 生成的,我们无法更改签名。

标签: java json jackson wrapper


【解决方案1】:

你也可以专门为这个类使用ObjectWriter

MyPojo mp = new MyPojo();
mp.setId(4);
ObjectMapper mapper = new ObjectMapper();
ObjectWriter writer = mapper.writer().withRootName("TestPojo");
System.out.println(writer.writeValueAsString(mp));

【讨论】:

  • 好主意。你对反序列化有这样的想法吗?
  • 你可以使用mapper.reader().withRootName("TestPojo").forType(MyPojo.class)
  • 如果根名称总是相同的,那么是的。休息取决于用例。
  • 我需要一个在下次调用 mapper.reader() 后仍能正常工作的解决方案
【解决方案2】:

您可以像这样创建一个新类,而不是使用SerializationConfig.Feature.WRAP_ROOT_VALUE

public class MyWrapper {

    private MyPojo myName = new MyPojo();

    public void setId(int id) { myName.setId(id); }
}

如果您使用此类型的对象创建 JSON,则该属性将具有名称 myName,例如:{"myName" : {"id" : 4} }

【讨论】:

  • 我做不到
  • thrift 生成的我的课程
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2018-10-04
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多