将嵌套的JSON字符串转换为java对象的列表

时间:2018-02-13 08:48:24

标签: java json parsing jackson

我有这个json String

node-forge

相应的java类是

{"data":"[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz]", "id":"123"}

我想使用Jackson将此public class Level { public LevelKey key; public String id; } public class LevelKey{ public String keyEnd; } json字符串转换为data对象列表

Level

但我收到的错误

 ObjectMapper mapper = new ObjectMapper();
    List<Level> arr = mapper.readValue(data, new TypeReference<List<Level>>(){});

还有其他解析方法吗?

3 个答案:

答案 0 :(得分:1)

以下内容看起来不像是一个合适的JSON(标准固定字符串除外)

"[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz]"

您可以将JSON的数据部分更正为以下内容(最接近您的JSON):

[\"Level [key=LevelKey [keyEnd=0], Description=abc]\",\" Level [key=levelKey [keyEnd=1], Description=xyz]\"]
  

还有其他解析方法吗?

您可以使用ArrayList的直接类引用,而不必像下面那样实例化TypeReference来解析上面(已更正的)json字符串:

List<Level> arr = mapper.readValue(data, (new ArrayList<Level>()).getClass());

答案 1 :(得分:1)

我必须说这是一个有趣的问题。看看代码片段,我认为我认为它是正确的:

{
  "d_obs": 1999,
  "f_name": "p_add",
  "f_str": "CCD",
  "d_left": 48.9,
  "d_pos_label": "YES",
  "left": [
    48.9
  ],
  "cat": [
    "40, Shiva residency, Near iscon mega mall, S.G. Highway"
  ],
  "obs": [
    1999
  ]
}

我得到了以下输出:

String data ="{\"data\":\"[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz]\", \"id\":\"123\"}";
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
List<Level> arr = mapper.readValue(data, (new ArrayList<Level>()).getClass());
System.out.println(arr);

此外,如果您遇到任何JsonParseException,根据文档意味着:

  

解析问题的异常类型,在非格式化内容时使用   (根据规范不符合JSON语法的内容)是   遇到。

因此,在攻击JSON时,您可以像这样更新ObjectMapper对象:

[{data=[Level [key=LevelKey [keyEnd=0], Description=abc], Level [key=levelKey [keyEnd=1], Description=xyz], id=123}]

同样如Exception_al所提到的,使用ArrayList的直接类引用,而不是像下面那样实例化TypeReference来解析上面(更正的)json字符串。

mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

希望这会有所帮助。

答案 2 :(得分:0)

String不是您希望将其反序列化为JAVA的JSON表示形式 这是一个JSON字符串:

"{"data":[{"key":{"keyEnd":0},"Description":"abc"},{"key":{"keyEnd":1},"Description":"abc"}],"id":"123"}"

因此,String存在问题,或者您需要自己进行解析。