如何使用Gson获取JSON元素类型?

8
在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...
1个回答

24
我写了这个简单的类来展示如何使用一些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的对应关系而进行缩进,也许您甚至不需要那个。请记住,在JSON中,您没有整数和双精度之间的区别,

JSON可以表示四种基本类型(字符串、数字、布尔值和null)和两种结构化类型(对象和数组)。

因此,如果您需要这种区分,您需要稍微修改我的方法。

.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接