14

私の現在のプロジェクトでは、AndroidでGSONライブラリを使用していますが、ネストされたマップの逆シリアル化の問題に直面しています。これは最初のjsonがどのように見えるかです

 {

"5":{
    "id":5,
    "name":"initial name",
    "image_url":"uploads/71d44b5247cc1a7c56e62fa51ca91d9b.png",
    "status":"1",
    "flowers":{
        "7":{
            "id":7,
            "category_id":"5",
            "name":"test",
            "description":"some description",
            "price":"1000",
            "image_url":"uploads/test.png",
            "status":"1",
            "color":"red",

        }
    }
  }
 }

そして私のpojoの

class Category {
long id;
String name;
String image_url;
HashMap<String,Flower> flowers;
}

そしてフラワークラス

class Flower {
long id;
String category_id;
String name;
String description;
String price;
String image_url;
String status;
}

しかし、このオブジェクトを逆シリアル化しようとすると、ネストされたハッシュマップにアクセスできます。サンプルコードは次のとおりです。

public class TestJson {
public static void main(String[] args) {
  Gson gson = new Gson();
    try {
    BufferedReader br = new BufferedReader(
        new FileReader("2.txt"));
    HashMap<String,Category> map = gson.fromJson(br, HashMap.class);
    Collection<Category> asd = map.values();
            System.out.println(map.values());

       } catch (IOException e) {
        e.printStackTrace();
       }

    }
 }

助言がありますか?

4

1 に答える 1

32

これgson.fromJson(br, HashMap.class);は、値タイプが不明なマップに逆シリアル化することをGsonに通知します。のようなものを指定したくなるかもしれMap<String,Category>.classませんが、Javaではこれを行うことができないため、解決策は、GsonでTypeTokenと呼ばれるものを使用することです。

Map<String, Category> categoryMap = gson.fromJson(br, new TypeToken<Map<String, Category>>(){}.getType());
于 2013-01-16T12:50:07.160 に答える