2015-05-09 3 views
0

Я работаю над десериализацией фида, поступающего с сервера. У меня возникла странная проблема с библиотекой Gson. Я использую код, который я нашел здесь, в стеке с аналогичной проблемой, но он не работает.Удаление десериализации объектов с помощью gson, ожидается BEGIN_ARRAY, но BEGIN_OBJECT в строке 1 столбец 2

Класс:

package com.lanceit.haito.lanceit.model; 

/*t*/ 

import java.sql.Timestamp; 
import java.util.ArrayList; 

public class FeedItem { 
    private String username; 
    private String title; 
    private String description; 

    private String id; 

    private int stage; 
    private int category; 

    private double cost; 

    private boolean completed; 

    private ArrayList<Attendant> attendants; 

    private Location loc; 

    private Timestamp createdAt; 
    private Timestamp expireAt; 

    public FeedItem(String username, String title, String description, String id, int stage, int category, double cost, boolean completed, ArrayList<Attendant> attendants, Location loc, String createdAt, String expireAt) { 
     this.username = username; 
     this.title = title; 
     this.description = description; 
     this.id = id; 
     this.stage = stage; 
     this.category = category; 
     this.cost = cost; 
     this.completed = completed; 
     this.attendants = attendants; 
     this.loc = loc; 
     this.createdAt = new Timestamp(Long.valueOf(createdAt)); 
     this.expireAt = new Timestamp(Long.valueOf(expireAt)); 
    } 

    public String getUsername() { 
     return username; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public String getDescription() { 
     return description; 
    } 
} 

Json:

[{ 
    "username": "q", 
    "title": "123213321213", 
    "description": "213", 
    "loc": { 
     "type": "Point", 
     "coordinates": [0, 0] 
    }, 
    "category": 0, 
    "cost": 123, 
    "stage": 0, 
    "attendants": [], 
    "completed": false, 
    "id": "553f4f272300001b004f4078", 
    "createdAt": "1430212391230", 
    "expireAt": "1437599771230" 
}, { 
    "username": "q", 
    "title": "123213321213", 
    "description": "213", 
    "loc": { 
     "type": "Point", 
     "coordinates": [0, 0] 
    }, 
    "category": 0, 
    "cost": 123, 
    "stage": 0, 
    "attendants": [], 
    "completed": false, 
    "id": "553f4f282300001b004f4079", 
    "createdAt": "1430212392752", 
    "expireAt": "1437599772752" 
}] 

К сожалению, я не знаю, где проблема ... Может кто-то мне точку в правильном направлении?

public static ArrayList<FeedItem> parseFeed(String toParse){ 
     Type collectionType = new TypeToken<Collection<FeedItem>>(){}.getType(); 
     ArrayList<FeedItem> outcome = new Gson().fromJson(toParse, collectionType); 
     return outcome; 
    } 

Ошибка

05-09 13:22:06.575 2554-2554/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.lanceit.haito.lanceit, PID: 2554 
com.google.gson.JsonSyntaxException: 1430212391230 
     at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:81) 
     at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:66) 
     at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:41) 
     at com.google.gson.internal.bind.TypeAdapters$22$1.read(TypeAdapters.java:526) 
     at com.google.gson.internal.bind.TypeAdapters$22$1.read(TypeAdapters.java:524) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) 
     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) 
     at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40) 
     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81) 
     at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60) 
     at com.google.gson.Gson.fromJson(Gson.java:803) 
     at com.google.gson.Gson.fromJson(Gson.java:768) 
     at com.google.gson.Gson.fromJson(Gson.java:717) 
     at com.lanceit.haito.lanceit.utils.SerializationHelper.parseFeed(SerializationHelper.java:55) 
     at com.lanceit.haito.lanceit.network.lanceHandler.ListAllLances$1.onResponse(ListAllLances.java:39) 
     at com.lanceit.haito.lanceit.network.lanceHandler.ListAllLances$1.onResponse(ListAllLances.java:29) 
     at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65) 
     at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5221) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
Caused by: java.text.ParseException: Unparseable date: "1430212391230" (at offset 13) 
     at java.text.DateFormat.parse(DateFormat.java:571) 
     at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:79) 
            at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:66) 
            at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:41) 
            at com.google.gson.internal.bind.TypeAdapters$22$1.read(TypeAdapters.java:526) 
            at com.google.gson.internal.bind.TypeAdapters$22$1.read(TypeAdapters.java:524) 
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:93) 
            at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:172) 
            at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40) 
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81) 
            at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:60) 
            at com.google.gson.Gson.fromJson(Gson.java:803) 
            at com.google.gson.Gson.fromJson(Gson.java:768) 
            at com.google.gson.Gson.fromJson(Gson.java:717) 
            at com.lanceit.haito.lanceit.utils.SerializationHelper.parseFeed(SerializationHelper.java:55) 
            at com.lanceit.haito.lanceit.network.lanceHandler.ListAllLances$1.onResponse(ListAllLances.java:39) 
            at com.lanceit.haito.lanceit.network.lanceHandler.ListAllLances$1.onResponse(ListAllLances.java:29) 
            at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:65) 
            at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
            at android.os.Handler.handleCallback(Handler.java:739) 
            at android.os.Handler.dispatchMessage(Handler.java:95) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5221) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
+0

Попробуйте: 'Тип collectionType = new TypeToken >() {}. GetType(); ' – Blackbelt

+0

вставьте свою Json String наиболее заметно, это вопрос формата –

+0

@Blackbelt да, попробовал. Все еще не работает. – Haito

ответ

1

Ваш Json формат массива не является правильным из-за того, что вы получаете выше исключение. У вас есть много дополнительных свойства и некоторые из ваших свойств оленьей кожи совпадают типы моделей:

кода, чтобы создать формат JSON:

public static String parseFeed(ArrayList<FeedItem> list) { 
     Type collectionType = new TypeToken<Collection<FeedItem>>() { 
     }.getType(); 
     String outcome = new Gson().toJson(list, collectionType); 
     return outcome; 

Действительно Формат: Произошла

[{"id":"id1","title":"title1","description":"desc1","createdAt":"Jan 1, 1970 12:00:00 PM","expireAt":"Jan 1, 1970 12:00:00 PM","lat":1.0,"lng":1.0,"cost":10,"category":1}] 
+0

Окей. Я вижу. У вас есть идея, как сгладить этот идентификатор? – Haito

+0

Создайте отдельный класс с именем id с свойством $ oid и обновите FeedItem, чтобы иметь этот новый тип –

+0

@haito ответ на ваш вопрос plz отметьте его как ответ –

1

Ошибки из-за корневой объект. Поскольку ваш корневой объект не содержит прямого массива, массив отображается по «фидам». Поэтому вам нужно создать еще один объект Bean для доступа к этому массиву.

public class FeedsList { 
    List<FeedItem> feeds; 
    String timestamp; 
} 

Теперь JSON может быть проанализирован с помощью

FeedsList feedsList = new Gson().fromJson(jsonSample, FeedsList.class); 

Но все же вам нужно изменить типы данных некоторых переменных в FeedItem потому id, loc, expireAt .. и т.д. объявлены как String ' s в FeedItem, но в данном json они объявлены как JsonObject

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