我用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字符串。
答案 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);