当前位置: 首页 > 知识库问答 >
问题:

如何在Jackson的json序列化过程中向对象添加额外字段?

施飞鸿
2023-03-14

在序列化为JSON时,我需要向对象添加新属性。该属性的值是在运行时计算的,在对象中不存在。同样,同一个对象也可以用于创建具有不同集合ot字段的不同JSON(有点像是有一个带有子类的基类,但我不想创建一个只用于JSON生成的基类)。

最好的方法是什么,它不涉及创建自定义序列化器类,它将处理整个对象字段集的序列化?或者可能继承一些“基本”序列化器,然后简单地获取它的输出并以某种方式添加新字段?

我了解了mixin,看起来可以重命名/隐藏一些字段,但是似乎不可能添加额外的字段。

共有3个答案

微生耘豪
2023-03-14

2021年来电...

我发现最简单的方法是@JsonUnwrapped

public class Envelope<T> {
  @JsonUnwrapped // content's fields are promoted alongside the envelope's
  public T content;
  // Transmission specific fields
  public String url;
  public long timestamp;
}

只要Envelope的字段名称与Content字段名称不冲突,就可以(双向)工作。还有一个很好的特性是在序列化JSON的末尾保留传输属性。

董新觉
2023-03-14

一个选项是为该属性添加一个字段,并在写入JSON之前在对象上设置它。第二个选项,如果属性可以从其他对象属性计算,你可以为它添加一个getter,例如:

public String getFullName() {
  return getFirstName() + " " + getLastName();
}

即使没有匹配的字段,Jackson在编写JSON时也会自动调用这个getter,并在JSON输出中显示为fullName。如果这不起作用,第三个选项是将对象转换为贴图,然后根据需要对其进行操作:

ObjectMapper mapper //.....
MyObject o //.....
long specialValue //.....
Map<String, Object> map = mapper.convertValue(o, new TypeReference<Map<String, Object>>() { });
map.put("specialValue", specialValue);

你的问题没有提到解组,但是如果你也需要这样做,那么第一个选项会很好,但是第二个选项需要一些调整。

至于编写同一对象的不同字段,这听起来像是@JsonView

陈飞语
2023-03-14

你能不能在value类中添加一个方法?注意,它不必是公共的,也不必使用getter命名约定;你可以这样做:

public class MyStuff {
   // ... the usual fields, getters and/or setters

   @JsonProperty("sum") // or whatever name you need in JSON
   private int calculateSumForJSON() {
        return 42; // calculate somehow
   }
}

否则,您可以将POJO转换为JSON树值:

JsonNode tree = mapper.valueToTree(value);

然后通过添加属性等方式对其进行修改。

 类似资料:
  • 问题内容: 我在MVC 4程序中使用Json.net。 我有一个阶级的对象。 我做了: 现在,我想添加一个额外的属性,如成。 我如何使用Json.net实现这一目标? 问题答案: 您有几种选择。 正如@Manvik所建议的那样,最简单的方法就是在类中添加另一个属性并在序列化之前设置其值。 如果您不想这样做,那么下一个最简单的方法是将您的对象加载到中,追加新属性值,然后从那里写出JSON。这是一个简

  • 如何用jackson(Java)反序列化Object中的json对象(在我的例子中,字段中提供对象)? 输入字符串: {“header”:“OFFER”,“message”:“{”author\“:\”Peter Smith\“,\”previous\“:null,\”current\“:{”id\“:\”eOUQieQdvB\“,”authorUserId\“:\”foo\“}” {“autho

  • 使用Jackson将JSON响应反序列化为DTO。 使用Gson或Jackson反序列化JSON时忽略空字段 他们仍然从那个不规则的JSON对象创建一个对象。 这意味着我需要遍历这个列表,并通过实现一个清理方法删除所有不具有属性“value”的对象。 我的带有Jackson注释的DTO: 给定JSON响应的结果是初始化了3个DTOs,而不是4个。

  • 我的控制器接收到的JSON数据如下: 问题是对象“ContainedObject”被解释为是,并且它正在被实例化。因此,只要我的控制器读取这个JSON数据,它就会生成一个ContainedObject对象类型的实例,但我需要它为空。 最简单、最快的解决方案是,在接收的JSON数据中,该值为空,如下所示: 我的实体类如下: 和包含的对象类,如下所示:

  • 有没有办法用Jackson来配置这个?如果没有,是否有一种有效的方法来编写(假设中的值可以是更复杂但众所周知的一致类型)?

  • 问题内容: 嗨,我正在使用Javascript使用以下代码创建带有键和值的对象数组。 结果,我得到了这样的对象数组: 当我尝试将其字符串化并在帖子中发送该JSON时,在我不想要的地方,我使用\和“格式化了错误的JSON,因此当我尝试在C#的代码背后将JSON作为JObject销毁时,我遇到了麻烦。如何使用stringify创建一个干净的JSON 我的JSON现在错了: 我想要一个像这样的JSON对