【问题标题】:Jackson Deserialize Variable as Json String [duplicate]Jackson将变量反序列化为Json字符串[重复]
【发布时间】:2011-12-29 12:56:54
【问题描述】:

我有一个这样的模型:

private String message;
private Integer errorCode;    
private String data;

例如,我从远程获取以下 JSON:

{"data": {"cat": "1.2.3.4", "ner": "80", "name": "pinta" }, "message" : "m", "errorCode" : 12}

当我反序列化这个 JSON 时,messageerrorCode 变量得到正确的值。但是我不想解释我的 data 变量的内容。相反,我希望它是以下字符串:

{"cat": "1.2.3.4", "ner": "80", "name": "pinta" }

之后,我会自己解释。我怎样才能得到data这个值?

【问题讨论】:

  • 你能说得清楚一点吗?
  • @MByD 当我在反序列化后调试变量时,我希望看到我的数据变量具有该值:{"cat": "1.2.3.4", "ner": "80", "name": "pinta" },因为我是这样发送的:"data":{"cat": "1.2.3.4", "ner": "80", "name": "pinta" }
  • 这个问题不是stackoverflow.com/q/4783421/1523648的重复问题。这个问题是一个寻找@JsonRawValue反序列化问题,而另一个问题已经知道@JsonRawValue,只是想知道为什么它在序列化期间不起作用。跨度>

标签: java json deserialization jackson


【解决方案1】:

Jackson issue 596 是为原始问题中描述的所需功能而创建的。如果您希望它实施,请投票支持它。

目前可用的解决方案是实现自定义反序列化处理。

另外,How can I include raw JSON in an object using Jackson? 线程也涵盖了这个主题。

【讨论】:

    【解决方案2】:

    我宁愿建议你让数据绑定到一个中间对象;通常这是java.util.Maporg.codehaus.jackson.JsonNode(JSON 树)。然后你可以以任何你想要的方式访问数据;包括使用ObjectMapper.convertValue(inputPojo, outputType)轻松转换为POJO)。

    【讨论】:

    • 感谢您的回答和投票。只想说清楚:我用那个myObject = mapper.readValue(data, clz);transferredObject = mapper.convertValue(data, clz);有什么区别?
    • readValue() 解析来自给定源的内容,而 convertValue() 相当于写入值,将其作为给定类型读回——它可以将任何可以序列化为 JSON 的内容转换为任何可以从 JSON 绑定。
    • +1 此问题的最佳答案。将类型保持为 JsonNode 使其能够仅调用 toString() 并获取 String json 值。当然是先反序列化,然后再序列化,有点浪费,但目前为止,只有这样才能做到干净整洁
    • 在期望成功的对象列表和失败的错误对象时出错
    • @Rasive 无需中间序列化:convertValue() 实际上避免了该步骤,仅创建令牌流以重新处理。这可以用任何对象模型完成,但JsonNode 通常是最自然的。
    猜你喜欢
    • 2020-05-20
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多