2016-07-15 4 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 
    } 
} 

私はGsonを使用して、このJSONを解析するためにJavaクラスを定義してみてください。

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

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

問題がcarsであるが、それは"count":128128CarSizeではありませんがあり、純粋なマップではありません。 JSONをどのように解析できますか?

JSONのソース文字列を変更することはできません。しかし、私はそれがMap<String, CarSize> carsのサイズであることを知っているので、 "カウント"プロパティを無視することはOKです。

答えて

1

Carsのオブジェクトがあり、車のリストがList<Car>で、count propertyのようです。

問題は、カウントプロパティがマップ内にあることです。私がしたことは、プロパティを追加するだけでマップを拡張することでした。

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; 
    } 
} 

コード読み取りに:

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; 
    } 
} 

カスタムシリアライザ/デシリアライザ:次に、あなたはこのマップ (出典get-nested-json-object-with-gson

モデル用に独自のシリアライザ/デシリアライザを定義する必要があります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

アレックスありがとう。しかし私はGsonを使用しています。 Gsonには 'ObjectMapper 'はありません。 –

+0

私の悪い!あなたのモデルをどのように定義すべきかについてはまだ議論の余地があります。 Gsonの場合は – alexbt

+0

、Gsonの場合は次のように更新します。 Gson gson = new Gson(); 車の車= gson.fromJson(json、Cars.class); // jsonはあなたのjson文字列です –

関連する問題