2016-05-12 4 views
0

имеет следующую строку: JSongson не десериализация массива

[{"Custom":{"id":4,"name":"Lebensmittel","currency":"EUR","count":2}}] 

Это сокращенный вариант, как правило, у меня есть очень длинный JSon строка с большим количеством объектов «Custom». Я получаю строку json от удаленной машины, на которой я не влияю. Я пытаюсь использовать следующий код deserialze в JSon Строка:

Gson gson = new Gson(); 
Custom[] data = gson.fromJson(json, custom[].class); 

Результат не THT размер массива данных правильно, но содержание равно нулю, нет значения десериализации.

Ниже представлен Pojo пользовательский класс

public class Custom implements Serializable { 

private static final long serialVersionUID = 1826747252056159012L; 

private int id; 

private String name; 

private String currency; 

private int count; 

public Custom() { 
} 

public int getId() { 
    return id; 
} 

public void setId(final int id) { 
    this.id = id; 
} 

public String getName() { 
    return name; 
} 

public void setName(final String name) { 
    this.name = name; 
} 

public String getCurrency() { 
    return currency; 
} 

public void setCurrency(final String currency) { 
    this.currency = currency; 
} 

public int getCount() { 
    return count; 
} 

public void setCount(final int count) { 
    this.count = count; 
} 

} 

Так, может кто-нибудь сказать мне, что wrog?

Thnaks заранее

+0

Ваш JSON более массив какого-либо объекта, у которого есть поле типа 'Custom' под названием« Custom » –

+0

, я также попытался использовать" wrapper ", который содержит список пользовательских объектов. Но это также не будет сериализовано. – piet

ответ

2

У Вас есть ошибка в вашем JSON:

[{"Custom":{"id":4,"name":"Lebensmittel","currency":"EUR","count":2}}] 

должен быть

[{"id":4,"name":"Lebensmittel","currency":"EUR","count":2}] 
+0

Проблема в том, что я получаю json с удаленной машины, которая генерирует этот json с помощью генератора PHP. Поэтому я ничего не могу изменить. – piet

+0

Просто подтвердите json с jsonlint и, похоже, правильно – piet

+0

В этом случае вы должны изменить свой объект Custom. И создайте объект с свойством Custom и Custom Type – Silvinus

0

Вы можете использовать пользовательские TypeAdapter (или JsonDeserializer, если вам не нужно сериализации)

private static class CustomTypeAdapter extends TypeAdapter<Custom>{ 
    private static final Gson gson = new Gson(); 
    @Override 
    public void write(JsonWriter out, Custom value) throws IOException { 
     if (value!= null) 
     out.beginObject() 
       .name("Custom") 
       .jsonValue(gson.toJson(value)) 
       .endObject(); 
    } 

    @Override 
    public Custom read(JsonReader in) throws IOException { 
     Custom custom = null; 
     in.beginObject(); 
     String name = in.nextName(); 
     if (name.equals("Custom")) { 
      custom = gson.fromJson(in, Custom.class); 
     } 
     in.endObject(); 
     return custom; 
    } 
} 

и зарегистрировать его, как это:

Gson gson = new GsonBuilder() 
      .registerTypeAdapter(Custom.class, new CustomTypeAdapter()) 
      .create(); 
Custom[] data = gson.fromJson(json, Custom[].class); 

Другой вариант заключается в использовании пользовательский обертку, как это:

public static class CustomWrapper{ 
    @SerializedName("Custom") 
    public Custom custom; 
} 

использования:

CustomWrapper[] data = gson.fromJson(json, CustomWrapper[].class); 
Смежные вопросы