Gson无法将String值转换为List,Java

时间:2013-04-03 10:23:33

标签: java json gson

我认为我足够强大,可以和Gson一起玩,但我发现了一些问题。

我有String需要转换为Object。 String是从某些xml生成的。

以下是第一个的示例:

{
"ClientData": {
    "pixelList": {
        "pixel": [{
            "b": 22,
            "a": 1234
        },
        {
            "b": 33,
            "a": 34344
        }]
    }
}
}

似乎很简单,对吧?

所以我创建了后续类,并成功将上面提到的String转换为Java Object。

public class ClientDataRoot {
   @SerializedName("ClientData") ClientData clientData = null;  
}

public class ClientData {   
   PixelList pixelList = null;      
}

public class PixelList {
   List<Pixel> pixel = null;
}

public class Pixel {    
   private String a = "";
   private String b = "";   

}

从第一个示例中,您可以看到pixelList有两个对象:pixel

但如果pixelList只有一个pixel会发生什么:

第二个

{
"ClientData": {
    "pixelList": {
        "pixel": {
            "b": 22,
            "a": 1234
        }
    }
}
}

我收到错误:

com.google.gson.JsonParseException: The JsonDeserializer
com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@d1918a failed to deserialize
json object {"b":22,"a":1234} given the type java.util.List<com.wefi.uxt.Pixel>

我的代码很简单:

import com.google.gson.Gson;
....
Gson gson = new Gson();
ClientDataRoot clientDataRoot1 = 
gson.fromJson(xmlJSONObj.toString(), ClientDataRoot.class);

我使用gson-1.7.1.jar

如果我从

更改课程PixelList,请顺便提一下
 public class PixelList {
   List<Pixel> pixel = null;
 }

为:

 public class PixelList {
    Pixel  pixel = null;
 }

它有效,但我需要它作为List

谢谢,

如何修复:

正如大家所说,当我尝试将XML转换为JSON时,该插件会将pixel转换为JSONObjext而不是JSONArray

这是我修复问题的代码:

  // responseBody is XML String
  JSONObject xmlJSONObj = XML.toJSONObject(responseBody);

            JSONObject cd = (JSONObject) xmlJSONObj.get("ClientData");
            JSONObject pl = (JSONObject) cd.get("pixelList");
            Object p = pl.get("pixel");

            if (p instanceof JSONObject) {
                JSONArray arr = new JSONArray();
                arr.put(p);

                pl.remove("pixel");
                pl.put("pixel", arr);
            }

感谢PeterMmm和R.J

2 个答案:

答案 0 :(得分:2)

这不应该是这种形式吗?带有1个元素的像素:

{
"ClientData": {
    "pixelList":{
        "pixel": [{
            "b": 22,
            "a": 1234
        }]
    }
}
}

答案 1 :(得分:1)

这是因为JSON返回的第三方返回了错误的JSON,或者如果您自己生成JSON,则表示您做错了。 pixelList中的单个元素应该有JSON,如下所示: -

{
    "clientData": {
        "pixelList": {
            "pixel": [
                {
                    "a": "22",
                    "b": "1234"
                }
            ]
        }
    }
}

要么需要更正JSON,要么你可以做这样的事情。有2个对象,1个type1(一个解析列表)和另一个type2(一个解析单个元素json)。

现在使用type1类解析json并将其保存在try-catch中。如果您获得此Exceptioncatch,请使用type2类进行解析。如果您无法修复JSON响应,这似乎是唯一的解决方法。