在JAVA中展平JSON字符串

时间:2019-05-08 11:21:51

标签: java json

我用Python编写了一个相当简单的抓取器,它从服务器抓取JSON字符串,并将其作为表输出/将其另存为CSV。我现在正在尝试将脚本移植到Java上,但是发现学习曲线要​​陡峭得多。

我已经尽可能提取了我的字符串,但是在重新创建原始python脚本的一部分时遇到了麻烦,该部分使JSON字符串的嵌套部分之一变平了。

我的JSON字符串中嵌套的元素看起来像这样:

"workItemProperties":[{"Key":"System.Id","Value":12345},{"Key":"System.Title","Value":"Title text here"},{"Key":"System.IterationPath","Value":"Some\Path\Here"},{"Key":"System.ChangedDate","Value":"\/Date(1555424893503)\/"},{"Key":"System.ChangedBy","Value":"Fred Smith <Fred\Smith>"},{"Key":"Microsoft.VSTS.TCM.AutomationStatus","Value":"Not Automated"}]

在Python中,以下代码将对此进行扁平化:

for i in JsonResults['testPoints']:
        for item in i['workItemProperties']:
            key = item['Key']
            i[key] = item['Value']
    del i['workItemProperties']

因此,与我的csv而不是只有一列内容的csv只是嵌套的workItemProperties字符串相比,System.Id,System.Title,System.IterationPath等将全部位于其自己的列中。

我对于在Java中重新编码和尝试重新创建上面的代码还很陌生,我假设我需要在JSONArray中循环遍历JSONObject,但是似乎无法正常工作。

这是我代码的主要部分(不包括我多次失败的拼合/取消嵌套尝试)。

    try {
            document = Jsoup.connect("http://url").userAgent("Opera").proxy("1.2.3.4", 1234).header("Authorization", "Basic " + base64login).timeout(10 * 1000).validateTLSCertificates(false).get();
            Elements jsCode = document.getElementsByClass("__allTestPointsOfSelectedSuite");
            String JsonResults = jsCode.html();
            output = new JSONObject(JsonResults);
            docs = output.getJSONArray("testPoints");
            File file=new File("JSONextract.csv");
                    String csv = CDL.toString(docs);
                 FileUtils.writeStringToFile(file, csv)
            System.out.println(csv);
        } catch (IOException e) {
            e.printStackTrace();
        }

我当前正在使用org.json库读取JSON字符串。

电流输出: Current Output

所需的输出: enter image description here

1 个答案:

答案 0 :(得分:1)

尝试一下,

如果仅需要workItemProperties的属性,

docs = output.getJSONArray("testPoints");
JSONArray  properties= new JSONArray();
for(int i = 0; i < docs.size(); i++)
{
      JSONObject object = docs.getJSONObject(i);
      JSONArray  workItemProperties=object.getJSONArray("workItemProperties");
      JSONObject property=new JSONObject();
      for(int j = 0; j < workItemProperties.size(); j++)
         {
      JSONObject temp=workItemProperties.getJSONObject(j);
      property.put(temp.getString("Key"),temp.getString("Value"));
         }
      properties.put(property);
}

File file=new File("JSONextract.csv");
String csv = CDL.toString(properties);
FileUtils.writeStringToFile(file, csv)
System.out.println(csv);

否则,

docs = output.getJSONArray("testPoints");
for(int i = 0; i < docs.size(); i++)
{
      JSONObject object = (JSONObject) docs.get(i);
      JSONArray  workItemProperties=object.getJSONArray("workItemProperties");
      for(int j = 0; j < workItemProperties.size(); j++)
         {
      JSONObject property=workItemProperties.getJSONObject(j);
      object.put(property.getString("Key"),property.getString("Value"));
         }
      object.remove("workItemProperties");
}

File file=new File("JSONextract.csv");
String csv = CDL.toString(docs);
FileUtils.writeStringToFile(file, csv)
System.out.println(csv);