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

时间:2013-12-17 01:04:20

标签: java arrays json hive gson

在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 个答案:

答案 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)以及两种结构化类型(对象和数组)

所以,如果你有什么区别,那么我的方法会有所改变。