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

标签 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...

最佳答案

我编写了这个简单的类,向您展示了如何使用一些 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你没有整数和 double 之间的区别,

JSON can represent four primitive types (strings, numbers, booleans, and null) and two structured types (objects and arrays)

所以如果你有什么区别,你可以稍微改变我的方法。

.

关于java - 如何使用 Gson 获取 JSON 元素类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20624042/

相关文章:

java - 将对象旋转到面点

java - 使用浏览器手动删除 cookie 后的请求

java - Java中的缓存模拟器,实现数据 block

javascript - 为父对象中的每个子对象(该子对象是数组)获取父对象的多个条目

java - 从 SpringMVC 中的 REST API 返回动态类型的最佳实践是什么

javascript - 尝试解析从 Observable 返回的错误

objective-c - hasBytesAvailable 提前完成

Java Xml 转换和代理

c# - 比较多个 arraylist 长度以找到最长的一个

arrays - 在 MIPS 中对整数进行排序