2016-07-15 132 views
1

我得到一个JSON字符串这样的:如何定义类来解析这个使用Gson的JSON?

{ 
    "cars": { 
    "ford": { 
     "length": 4460, 
     "weight": 1450 
    }, 
    "jeep": { 
     "length": 4670, 
     "weight": 1880 
    }, 
    "toyota": { 
     "length": 3830, 
     "weight": 1120 
    }, 
    . 
    . 
    . 
    "audi": { 
     "length": 5288, 
     "weight": 2432 
    }, 
    "subaru": { 
     "length": 4755, 
     "weight": 1790 
    }, 
    "count": 128 
    } 
} 

我尝试定义的Java类分析使用GSON这个JSON。

public class CarSize { 
    public int length; 
    public int weight; 
} 

public class JSONData { 
    public Map<String, CarSize> cars; 
} 

问题是cars是不是一个纯地图,它具有"count":128128不是CarSize。我如何解析JSON?

请注意我无法修改JSON的源字符串。但我可以忽略“count”属性,因为我知道这是Map<String, CarSize> cars的大小。

回答

1

看起来您有一个Cars对象,其中包含Car List<Car>count property的列表。

问题是,count属性在地图中。我所做的是扩展地图,只是为了添加属性。然后,你需要定义自己的串行器/解串器这个地图 (来源get-nested-json-object-with-gson

型号:

class Cars { 
    private MyMap cars = new MyMap(); 

    public MyMap getCars() { 
     return cars; 
    } 
    public void setCars(MyMap cars) { 
     this.cars = cars; 
    } 

    public void add(String name, Car car){ 
     cars.put(name, car); 
     cars.setCount(cars.getCount()+1); 
    } 

} 

class MyMap extends HashMap<String, Car> { 
    private int count; 

    public int getCount() { 
     return count; 
    } 

    public void setCount(int count) { 
     this.count = count; 
    } 
} 

class Car { 
    private int length; 
    private int weight; 

    public Car() { 

    } 

    public Car(int length, int weight) { 
     this.length = length; 
     this.weight = weight; 
    } 

    public int getLength() { 
     return length; 
    } 

    public void setLength(int length) { 
     this.length = length; 
    } 

    public int getWeight() { 
     return weight; 
    } 

    public void setWeight(int weight) { 
     this.weight = weight; 
    } 
} 

定制串行器/解串器:

class MyDeserializer implements JsonDeserializer<MyMap> 
{ 
    @Override 
    public MyMap deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { 
     JsonElement count = json.getAsJsonObject().remove("count"); 
     MyMap myMap = new Gson().fromJson(json.getAsJsonObject().toString(), type); 
     if(count!=null){ 
      myMap.setCount(count.getAsInt()); 
     } 
     return myMap; 
    } 
} 

class MySerializer implements JsonSerializer<MyMap> 
{ 
    @Override 
    public JsonElement serialize(MyMap src, Type type, JsonSerializationContext context) { 
     JsonElement serialize = context.serialize(src, Map.class); 
     serialize.getAsJsonObject().add("count", new JsonPrimitive(src.getCount())); 
     return serialize; 
    } 
} 

代码阅读并写出json:

String json = "{\"cars\":{\"jeep\":{\"length\":4670,\"weight\":1450},\"ford\":{\"length\":4460,\"weight\":1880},\"count\":128}}"; 
Cars cars = new Cars(); 
cars.add("jeep", new Car(4670, 1450)); 
cars.add("ford", new Car(4460, 1880)); 

Gson gson = new GsonBuilder() 
      .registerTypeAdapter(MyMap.class, new MyDeserializer()) 
      .registerTypeAdapter(MyMap.class, new MySerializer()) 
      .create(); 

String json2 = gson.toJson(cars); 
cars = gson.fromJson(json, Cars.class); 
cars = gson.fromJson(json2, Cars.class);   
+0

谢谢Alex。但我正在使用Gson。 Gson没有'ObjectMapper'。 –

+0

我的不好!但它仍然激起了如何定义模型的问题。我会用Gson更新它 – alexbt

+0

对于Gson,您可以使用: Gson gson = new Gson();汽车汽车= gson.fromJson(json,Cars.class); // json是你的json字符串 –