2013-04-03 3 views
1

Я думал, что Im достаточно силен, чтобы играл с Gson, но я нашел некоторую проблему.Gson не может преобразовать значение String в List, Java

У меня есть строка, которую мне нужно преобразовать в объект. Строка создается из некоторого xml.

Вот пример первого одного:

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

Кажется просто, правда?

Итак, я создал следующие классы и смог конвертировать вышеупомянутый объект String в Java.

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 = ""; 

}

С 1 Например, вы можете увидеть, что pixelList имеет 2 объекта: pixel.

Но что произойдет, если вы получаете pixelList с одним pixel:

2 один:

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

Здесь я получаю ошибку:

com.google.gson.JsonParseException: The JsonDeserializer 
[email protected] 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

BTW, если я сменю класс PixelList из

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

к:

public class PixelList { 
    Pixel pixel = null; 
} 

Он работает, но мне нужно это как список

Спасибо,

Как это исправить:

Как ребята говорят, когда я пытаюсь преобразовать 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

ответ

1

Это потому, что либо JSON возвращение третьей стороны возвращает неправильный JSON, или если вы генерирование JSON самостоятельно, вы делаете это неправильно.один элемент в pixelList должен иметь JSON, что будет выглядеть следующим образом: -

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

Либо JSON нужно исправить или иначе, вы можете сделать что-то вроде этого. У вас есть 2 объекта, 1 из type1 (один, который анализирует список), а другой из type2 (тот, который анализирует один элемент json).

Теперь проанализируйте json с помощью класса type1 и сохраните его в try-catch. Если вы нашли это, Exception, catch его и разобрать его с помощью type2. Это, кажется, единственный обходной путь, если вы не можете получить ответ JSON.

+0

Спасибо, я нашел решение (не упоминал в моем вопросе, размещенном в нижней части вопроса) –

2

Sould'nt это может быть в такой форме? Пиксель с 1 элементом:

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

Вы правы, но я получил этот текстовый файл из XML и не могу изменить содержание GSON. Или только разобрать его –

+0

Затем объявите 2-й класс, чтобы покрыть этот случай и поймать Исключение. – PeterMmm

+0

Спасибо, я нашел решение (не упоминал в моем вопросе, размещенное в нижней части вопроса) –

Смежные вопросы