在序列化为JSON时,我需要向对象添加新属性。该属性的值是在运行时计算的,在对象中不存在。同样,同一个对象也可以用于创建具有不同集合ot字段的不同JSON(有点像是有一个带有子类的基类,但我不想创建一个只用于JSON生成的基类)。
最好的方法是什么,它不涉及创建自定义序列化器类,它将处理整个对象字段集的序列化?或者可能继承一些“基本”序列化器,然后简单地获取它的输出并以某种方式添加新字段?
我了解了mixin,看起来可以重命名/隐藏一些字段,但是似乎不可能添加额外的字段。
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的末尾保留传输属性。
一个选项是为该属性添加一个字段,并在写入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
你能不能在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对