【问题标题】:Coverting JSON String which is part of JSON object to JSON Object on the run在运行时将作为 JSON 对象一部分的 JSON 字符串转换为 JSON 对象
【发布时间】:2016-07-21 19:44:30
【问题描述】:

我在我的项目中使用 REST 模板使用 REST Web 服务,该模板返回如下 JSON:

{"data": [{
        "id": "INT-1468819244684-event-no-97",
        "object1": {
            "JSONString": "{\"object2\":[{\"object3\":\"value3\",\"object4\":\"value4\"}]}"
        }
    }]

}

在使用上述 JSON 响应时,我能够创建一个 bean 类并将 JSON 对象/值转储到其中。

但问题是上面的json响应包含如下字符串:

"JSONString": "{\"object2\":[{\"object3\":\"value3\",\"object4\":\"value4\"}]}"

这实际上是一个json。所以我有一个 bean,我可以在其中获取 JSONString 作为字符串。所以目前我可以使用下面的 bean 结构来获取对象中的响应:

public class response {
Data data;
}

public class Data {
String id;
Object1 object1;
}

public class Object1 {
String jsonString;
}

但上面的 jsonString 包含一个 json 形式的字符串,所以我想在运行时以某种方式将此 JSON 字符串转换为 JSON 对象,只有在创建其他对象并将其所有内容转储到同一个 bean 时,应用程序应该是准备使用它的内容。所以理想情况下,我的 bean 层次结构应该如下所示:

public class response {
Data data;
}

public class Data {
String id;
Object1 object1;
}


public class Object1 {
JSONString jsonString;
}

public class JSONString {
Object2 object2;
}

public class Object2 {
String object3;
String object4;
}

请指导我如何做同样的事情。

【问题讨论】:

  • 最后一段真的不清楚。您能否edit 展示您的 bean,以及您要做什么?
  • @4castle 我会试一试。它们有一个键值对,其中值是一个 JSON 字符串,其字符串值内容是一个 JSON 对象。他们想反序列化,就好像那个 JSON 对象是 kvp 的值而不是 JSON 字符串,即。 {"object2":[{"object3":"value3", "object4":"value4"}]}
  • @SotiriosDelimanolis 谢谢!好的,我现在明白了。
  • 可能还有更多,但这里有一个相关问题:Jackson double serialized json string to Java object
  • @4castle:我添加了 bean,希望能提供更多的清晰度。

标签: java json spring jackson gson


【解决方案1】:

你可以这样使用Jackson的ObjectMapper.readValue:

// Create or use your existing ObjectMapper
ObjectMapper om = new ObjectMapper();

@JsonProperty("JSONString")
public String getJSONString() {
    if (this.jsonString == null)
        return null;
    return om.writeValueAsString(this.jsonString);
}

public void setJSONString(String s) {
    this.jsonString = om.readValue(s, JSONString.class);
}

【讨论】:

  • 这如何解决他们将双重编码的 JSON 对象作为 JSON 字符串的问题?
  • 你可以这样更新setter:``` @JsonProperty("JSONString") public String getJSONString() { if (this.jsonString == null) { return null; } 返回 om.writeValueAsString(this.jsonString); } public setJsonString(String jsonString) { this.jsonString = om.readValue(jsonString, JSONString.class); } ```
  • 请将其编辑到您的答案中并解释为什么它与他们的问题有关。
  • 完美!在 Object1 类中使用上述代码,我可以使用 jsonString 作为 JsonString 对象而不是 String。非常感谢@Rick。
  • k_b:没问题。 @SotiriosDelimanolis:感谢您帮助我加入 SO。
猜你喜欢
  • 1970-01-01
  • 2019-08-27
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
相关资源
最近更新 更多