我认为我足够强大,可以和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
答案 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
中。如果您获得此Exception
,catch
,请使用type2
类进行解析。如果您无法修复JSON
响应,这似乎是唯一的解决方法。