使用gson转换应该是对象数组的json,但不是

时间:2014-07-03 13:49:59

标签: java json gson

{"myContainer" : 
   { "couldBeAnything" : [
                          {"id":1, "name":"sb", "category":"couldBeAnything"},
                          {"id":2, "name":"bs", "category":"couldBeAnything"}
                         ],
      "somethingElse" : [
                        {"id":1, "name":"sdsa","category":"somethingElse"},
                        {"id":2, "name":"ve","category":"somethingElse"}
                       ]
   },
 "id" : 0
}

到目前为止,我有:

Type myContainerType = new TypeToken<MyContainer>(){}.getType();
MyContainerType myContainerType = gson.fromJson(myJson.getValue(), myContainerType);

哪里

public class MyContainer {
    private int id;
    private Map<String, List<Foo>> foo; // and foo has id, name, category

结果,没有错误,填充的id字段,但只是一个空映射

1 个答案:

答案 0 :(得分:2)

我认为结构Map<String, List<Foo>>的json是错误的。当您说地图时,您不需要使用{将每个键值括起来。只需将整个键值放在一个{}中,然后用逗号分隔即可。例如

{
  "myContainer": {
    "couldBeAnything": [
      {
    "id": 1,
    "name": "sb",
    "category": "couldBeAnything"
      },
      {
    "id": 2,
    "name": "bs",
    "category": "couldBeAnything"
      }
    ],
    "somethingElse": [
      {
    "id": 1,
    "name": "sdsa",
    "category": "somethingElse"
      },
      {
    "id": 2,
    "name": "ve",
    "category": "somethingElse"
      }
    ]
  },
  "id": 0
}

有了这个json,它可以很好地运作

public static void main(String[] args){
    String json = "{\"myContainer\":{\"couldBeAnything\":[{\"id\":1,\"name\":\"sb\",\"category\":\"couldBeAnything\"},{\"id\":2,\"name\":\"bs\",\"category\":\"couldBeAnything\"}],\"somethingElse\":[{\"id\":1,\"name\":\"sdsa\",\"category\":\"somethingElse\"},{\"id\":2,\"name\":\"ve\",\"category\":\"somethingElse\"}]},\"id\":0}";

    Map<String, List<Foo>> obj = new HashMap<String, List<Foo>>();
    Gson gson = new Gson();
    obj = gson.fromJson(json, obj.getClass());
    System.out.println(obj);
}

输出

{id=0.0, myContainer={couldBeAnything=[{id=1.0, name=sb, category=couldBeAnything}, {id=2.0, name=bs, category=couldBeAnything}], somethingElse=[{id=1.0, name=sdsa, category=somethingElse}, {id=2.0, name=ve, category=somethingElse}]}}

你的方法的问题是字段foo的命名。您的json包含Map<String, List<Foo>>名称作为myContainer。所以修改你的容器类,如下所示,它将正常工作:)

public class MyContainer {
    private int id;
    private Map<String, List<Foo>> myContainer; 
}

现在这将有效

Type myContainerType = new TypeToken<MyContainer>(){}.getType();
MyContainer myContainer = gson.fromJson(json, myContainerType);
System.out.println(myContainer);