1

我收到以下 json 作为程序的输入:

{
    "shopping": {
        "cart": {
            "items": [{
                "iturl" : "https://www.google.com/",
                "itdesc" : "Item’s box includes the below contents:\n a.adaptor \n b.sdfd"
            }]
        }
    }
}

我们正在使用 jayway jsonpath 来解析这些数据并进行一些处理并将最终值作为字符串返回。

当我们使用默认的 jsonpath 配置解析它时,我将 iturl 修改为“https:\/\/www.google.com\/”

尝试将 JSONProvider 更改为 JacksonJsonProvider (通过使用 Jackson 或 Gson 引用 Jsonpath)并解决了 url 的问题,但是,itdesc 的值现在变成了新行(由于 \n)使其成为无效的 json。

我不能专门处理每个字段,因为传入的数据将是动态的。

是否有任何适当的方法可以在 java 中解析这种 JSON。在此先感谢您的帮助

4

2 回答 2

0
{
"shopping": { <-- JSONObject
    "cart": { <-- JSONObject
        "items": [{ <-- JSONArray
            "iturl" : "https://www.google.com/", <-- JSONObject inside JSONAray
            "itdesc" : "Item’s box includes the below contents:\n a.adaptor \n b.sdfd"
        }]
    }
}

}

如果此数据 json 来自 http 连接。这个 json 必须是字符串格式,并尝试使用 org.json.simple 这样做:

private void readData() {
    String Body = (response json string from connection);
    JSONParser parse = new JSONParser();
    String iturl = null;
    String itdesc = null;

    try  {
        JSONObject shopping =  (JSONObject) parse.parse(Body);
        JSONObject cart=  (JSONObject) shopping.get("cart");
        JSONArray  items = (JSONArray  ) cart.get("items ");
        items.forEach((k)-> {
            JSONObject inside = (JSONObject) k;
            iturl = inside.get("iturl");
            itdesc = inside.get("itdesc");
        });
    }catch ( ParseException e) {
        e.printStackTrace();
    }

}

如果这来自 file.json 与 reader 结合:

private static final File jsonData = new File(file.json);
private void callData() {
    String iturl = null;
    String itdesc = null;
    try  {
        Reader reader = new FileReader(marketList);
        JSONParser parse = new JSONParser();
        JSONObject shopping =  (JSONObject) parse.parse(reader);
        JSONObject cart=  (JSONObject) shopping.get("cart");
        JSONArray  items = (JSONArray  ) cart.get("items ");
        items.forEach((k)-> {
            JSONObject inside = (JSONObject) k;
            iturl = inside.get("iturl");
            itdesc = inside.get("itdesc");
        });
    } catch (IOException | ParseException e) {
        e.printStackTrace();
    }
}
于 2020-07-23T07:36:04.260 回答
0

尝试在解析字符串之前再添加一个转义级别,字符串解析器会为“\\n”提供“\n”。

例如,使用 Jackson ObjectMapper 进行解析。

objectMapper.readValue(jsonString.replace("\\", "\\\\"), Any.class);
于 2020-07-22T09:52:15.120 回答