在JSON文件中,文件中的每个对象都由不同类型的JSON元素组成。 (整数,字符串,数组,对象数组等)
我的目标是列出所有元素名称和相应的类型。我可以知道如何在Gson中这样做吗?这样做的目的是创建一个Hive架构。
示例:
{
"number": 1,
"ts": "1386848002",
"cmpg": [
{
"id": 476,
"mcp": 0,
"deals": [ ],
"cookie": "uid:123",
"bid": [
{
"bId": 0,
"status": "ZB",
"rmtchID": -1
}
]
}
]
}
输出:
number int,
ts String,
cmpg array<map<String, Object>> // not sure how to interpret this...
答案 0 :(得分:16)
我编写了这个简单的类,向您展示如何使用一些Gson类来获得所需的内容。
package stackoverflow.questions.q19124387;
import java.util.Map;
import com.google.gson.*;
public class Q20624042 {
private static String printClass(JsonElement je, String ident) {
StringBuilder sb = null;
if (je.isJsonNull())
return "null";
if (je.isJsonPrimitive()) {
if (je.getAsJsonPrimitive().isBoolean())
return "Boolean";
if (je.getAsJsonPrimitive().isString())
return "String";
if (je.getAsJsonPrimitive().isNumber()){
return "Number";
}
}
if (je.isJsonArray()) {
sb = new StringBuilder("array<");
for (JsonElement e : je.getAsJsonArray()) {
sb.append(printClass(e, ident+ " "));
}
sb.append(">");
return sb.toString();
}
if (je.isJsonObject()) {
sb = new StringBuilder("map<\n");
for (Map.Entry<String, JsonElement> e : je.getAsJsonObject().entrySet()) {
sb.append(ident);
sb.append(e.getKey()).append(":");
sb.append(printClass(e.getValue(), ident+" "));
sb.append("\n");
}
sb.append(ident);
sb.append(">");
return sb.toString();
}
return "";
}
public static void main(String[] args) {
String json = "{" + "\"number\":1," + "\"ts\":\"1386848002\"," + "\"cmpg\":[{\"id\":476,\"mcp\":0.0000,\"deals\":[],\"cookie\":\"uid:123\",\"bid\":[{\"bId\":0,\"status\":\"ZB\",\"rmtchID\":-1}]}]}";
JsonElement je = new JsonParser().parse(json);
System.out.println(printClass(je," "));
}
}
这是你的JSON字符串的结果:
map<
number:Number
ts:String
cmpg:array<map<
id:Number
mcp:Number
deals:array<>
cookie:String
bid:array<map<
bId:Number
status:String
rmtchID:Number
>>
>>
>
JSON具有递归性质,因此解决此类问题的唯一方法是编写递归方法。我的缩进系统很天真,我只是为了显示与你的JSON的对应关系缩进,也许你根本不需要它。请记住,in JSON整数和双精度没有区别,
JSON可以表示四种基本类型(字符串,数字, 布尔值和null)以及两种结构化类型(对象和数组)
所以,如果你有什么区别,那么我的方法会有所改变。