今天想扒下来国家数据网下的部分数据,dfs遍历当isParent为false时即可获得带有具体数据的json串。
发现这个json串极其复杂,重新研究了一下Gson对于json的各种处理方法。
1、首先因为在浏览器中调试发现中文乱码问题,所以需要通过method.getResponseBodyAsStream()把编码格式改成UTF-8,而不是直接method.getResponseBodyAsString()
<span style="white-space:pre"> </span>HttpClient client = new HttpClient();
GetMethod method = new GetMethod(url);
client.executeMethod(method);
// 修改编码格式
InputStream in = method.getResponseBodyAsStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in,
"utf-8"));
String tempbf = null;
StringBuffer bodyBuffer = new StringBuffer(100);
while ((tempbf = br.readLine()) != null) {
bodyBuffer.append(tempbf + "\n");
}
String responseBody = bodyBuffer.toString();
2、因为我们需要的只是wdnodes中的数据(处理过程省略),而wdnodes是一个json数组
JsonArray wdnodes = JsonUtil.json2JsonArray(wdnodesString);
int cntWdNode = 0, cntNode = 0;
for (JsonElement wdnode : wdnodes) {
System.out.println("这是第 " + cntWdNode + " 号wdNode:");
cntWdNode++;
// 将每个wdnode转换为jsonObject
JsonObject wdnodeJSObject = wdnode.getAsJsonObject();
// 将nodes节点下的内容转为JsonArray,并解析
System.out.println("\tnodes中数据如下:");
JsonArray nodes = wdnodeJSObject.getAsJsonArray("nodes");
String wdcode = wdnodeJSObject.get("wdcode").getAsString();
String wdname = wdnodeJSObject.get("wdname").getAsString();
cntNode = 0;
for (JsonElement node : nodes) {
// 将每个node转换为jsonObject
JsonObject nodeJSObject = node.getAsJsonObject();
System.out.println("\t\t第 " + cntNode + " 号node:"
+ nodeJSObject.toString());
//获得每个jsonObject对应的Data对象
Data data = JsonUtil.map2Data(nodeJSObject.entrySet());
data.set("wdcode", wdcode);
data.set("wdname", wdname);
System.out.println("data: "+data);
data.save();
cntNode++;
}
// // wdcode节点下的内容是个字符串,将其解析
// System.out.println("\twdcode中数据如下:" + wdnodeJSObject.get("wdcode").getAsString());
// // wdname节点下的内容是个字符串,将其解析
// System.out.println("\twdname中数据如下:" + wdnodeJSObject.get("wdname").getAsString());
}
以上用到的类:JsonElement、JsonObject 、JsonArray、都是Gson中封装好的。
JsonElement:是一个抽象类,代表着json串的某一个元素。JsonObject,JsonArray,JsonPrimitive,JsonNull都是JsonElement这个抽象类的子类。并且提供了一系列的方法来判断当前的JsonElement。
JsonObject:可以看成 name/values的集合,其实就是最最基本的那种json字符串。
JsonArray:json字符串的数组呗。
3、控制台的输出结果
4、反思:
一开始我想直接使用fromJson来处理复杂的json数据,发现这是不现实的
<span style="white-space:pre"> </span>public final static Map json2Map(String jsonStr){
return gson.fromJson(jsonStr, new TypeToken<Map<String, Object>>(){}.getType());
}
虽然Object能够引用解析出来的新的Json串,甚至可以直接赋值给具体的实体,但是Gson无法自动的把赋值给Object的Json串进行解析。即虽然这个实体获得了Json串,但是它并不能获得其中的任一属性,所有的getter都为空。空有一身数据却拿不出来,真是个悲伤的故事。