2012-07-05 182 views
1

解析使用Gson的json时出现问题。 这里是我的代码:使用Gson解析json java

Gson gson = new GsonBuilder().create(); 
String json = gson.toJson(myMap.values()); 
MyClass clazz = gson.fromJson(json, MyClass.class); 
System.out.println(clazz.toString()); 

,但我得到了一个错误(我也试图与新TypeToken,但错误是一样的):

com.google.gson.JsonParseException: The JsonDeserializer MapTypeAdapter failed to deserialized json object /*here is json object*/ 

Caused by: java.lang.IllegalArgumentException: Map objects need to be parameterized unless you use a custom serializer. Use the com.google.gson.reflect.TypeToken to extract the ParameterizedType. 
    at com.google.gson.TypeInfoMap.<init>(TypeInfoMap.java:45) 
    at com.google.gson.DefaultTypeAdapters$MapTypeAdapter.deserialize(DefaultTypeAdapters.java:605) 
    at com.google.gson.DefaultTypeAdapters$MapTypeAdapter.deserialize(DefaultTypeAdapters.java:573) 
    at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:50) 

这里得到JSON字符串,它是有效的(但可能是我应该删除“项目”子字符串?):

["{\n 
    \"items\": 
     [ 
     \n { 
     \n \"MyClass_type_var1\": { 
     \n \"field1\": \"val1\", 
     \n \"field2\": \"val2\", 
     \n \"field3\": [ 
         \n  { 
         \n  \"subfield1\": subval 
         \n  } 
         \n ] 
         \n } 
         \n }, 
     \n \"MyClass_type_var2\": { 
     \n \"field1\": \"val1\", 
     \n \"field2\": \"val2\", 
     \n \"field3\": [ 
         \n  { 
         \n  \"subfield1\": subval 
         \n  } 
         \n ] 
         \n } 
         \n }, 
     \n \"MyClass_type_var3\": { 
     \n \"field1\": \"val1\", 
     \n \"field2\": \"val2\", 
     \n \"field3\": [ 
         \n  { 
         \n  \"subfield1\": subval 
         \n  } 
         \n ] 
         \n } 
         \n }, 


etc...... may I haven't closed brackets correctly, but they are correct :)     
      }   
     ]    
    "]     

我会感谢任何建议。

public final class MyClass extends GenericJson { 

    private String field1; 
    private String field2; 
    private java.util.List<AClass> field3; // has subfield1 
//getters and setters 
} 

单行JSON:

["{\n \"items\": [ \n { \n \"MyClass\": { \n \"field1\": \"val1\", \n \"field2\": \"val2\", \n \"field2\": [ \n { \n \"subfield1\": subval \n } \n ] \n } \n }, \n \"MyClass\": { \n \"field1\": \"val1\", \n \"field2\": \"val2\", \n \"field2\": [ \n  { \n  \"subfield1\": subval \n  } \n ] \n } \n }, \n \"MyClass\": {\n \"field1\":\"val1\", \n \"field2\": \"val2\", \n \"field2\": [ \n  { \n  \"subfield1\": subval \n  } \n ] \n } \n }, }   ] "] 
+2

你可以发布MyClass。 – 2012-07-05 09:38:01

+0

什么是MyClass – 2012-07-05 09:41:47

+0

添加MyClass代码 – 2012-07-05 09:45:27

回答

1

here我试着使用同时杰克逊,但它并没有帮助。看到这个问题的答案(使用我自己的解析器)。

0

尝试是这样的:

MyClass的:

import java.util.List; 

public class MyClass { 

    public List<Item> items; 

    public static class Item{ 

     public List<innerData> MyClass_type_var1; 
     public List<innerData> MyClass_type_var2; 
     public List<innerData> MyClass_type_var3; 

     public static class innerData{ 
      public String field1; 
      public String field2; 
      public List<String> field3; 
     }  
    } 
} 

MyClass cls = new Gson().fromJSon(json, MyClass.class); 

希望这将引导您去正确的方向:-)

编辑:

试试这个

public class NewClass{ 
    public List<MyClass> items; 
} 

NewClass cls = new Gson().fromJSon(json, NewClass.class); 
+0

我无法更改MyClass,因为我从第三方库使用它,但我可以生成我自己的。都一样,谢谢你的想法。 – 2012-07-05 09:59:39

+0

尝试编辑:-) – 2012-07-05 10:17:30

+0

com.google.gson.JsonParseException:期待数组但找到对象 – 2012-07-05 10:31:41