2013-12-17 1 views
4

В файле JSON каждый объект внутри файла состоит из разных элементов JSON. (целое число, строка, массив, массив объектов и т. д.)Как получить тип элемента JSON с помощью Gson?

Моя цель - указать все имя элемента и соответствующий тип. Могу я узнать, как я могу это сделать в Гсоне? Целью этого является создание схемы улья.

Пример:

{ 
    "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... 

ответ

11

я написал простой класс, который показывает вам, как использовать некоторые классы 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 может представлять четыре примитивных типов (строки, числа, булевы и нулевые) и два структурированных типов (объекты и массивы)

так что если вы какое-то отличие, вы немного изменили мой метод.

.

Смежные вопросы