Android Json GSon выпускного вечера - PullRequest
0 голосов
/ 11 июля 2011

Я пытаюсь GSOn для анализа JSON. Вот мой код:

    public class ProgramList {

        private List<Program> programs;

        public List<Program> getPrograms() {
            return programs;
        }

        public void setPrograms(List<Program> programs) {
            this.programs = programs;
        }
    }

    public class Program {
        private String id;
        private String startTime;
        private String endTime;
        private String showDate;
        private String title;
        private String episodeTitle;
        private String description;
        private String duration;
        private String showLink;
        private String genre;
        private String archived;

        public String getID() {
            return id;
        }
        public void setID(String ID) {
            this.id = ID;
        }
        public String getStartTime() {
            return startTime;
        }
        public void setStartTime(String startTime) {
            this.startTime = startTime;
        }
        public String getEndTime() {
            return endTime;
        }
        public void setEndTime(String endTime) {
            this.endTime = endTime;
        }
        public String getShowDate() {
            return showDate;
        }
        public void setShowDate(String showDate) {
            this.showDate = showDate;
        }
        public String getTitle() {
            return title;
        }
        public void setTitle(String title) {
            this.title = title;
        }
        public String getEpisodeTitle() {
            return episodeTitle;
        }
        public void setEpisodeTitle(String episodeTitle) {
            this.episodeTitle = episodeTitle;
        }
        public String getDescription() {
            return description;
        }
        public void setDescription(String description) {
            this.description = description;
        }
        public String getDuration() {
            return duration;
        }
        public void setDuration(String duration) {
            this.duration = duration;
        }
        public String getShowLink() {
            return showLink;
        }
        public void setShowLink(String showLink) {
            this.showLink = showLink;
        }
        public String getGenre() {
            return genre;
        }
        public void setGenre(String genre) {
            this.genre = genre;
        }
        public String getArchived() {
            return archived;
        }
        public void setArchived(String archived) {
            this.archived = archived;
        }
    }

    InputStream getJSONData(String url){
            DefaultHttpClient httpClient = new DefaultHttpClient();
            URI uri;
            InputStream data = null;
            try {
                uri = new URI(url);
                HttpGet method = new HttpGet(uri);
                HttpResponse response = httpClient.execute(method);
                data = response.getEntity().getContent();
                InputStream modData = data;
                //Log.i("MY INFO", "data: " + slurp(modData));
            } catch (Exception e) {
                e.printStackTrace();
            }

            return data;
    }

    public class ScheduleActivity  extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

    Reader ScheduleListingReader = new InputStreamReader(getJSONData("http://stage.sitv.com/api/v1/getScheduleByDate?date=2011-07-04"));

    Gson gson = new Gson();

    ProgramList objs =  gson.fromJson(ScheduleListingReader, ProgramList.class);
}
}

Теперь, когда я запускаю приложение, я получаю следующую ошибку:

    07-11 19:00:34.871: WARN/System.err(4519): com.google.gson.JsonParseException: Expecting array but found object: com.nuvotv.model.ProgramList@4597d758
07-11 19:00:34.871: WARN/System.err(4519):     at com.google.gson.JsonArrayDeserializationVisitor.startVisitingObject(JsonArrayDeserializationVisitor.java:89)
07-11 19:00:34.871: WARN/System.err(4519):     at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:119)
07-11 19:00:34.871: WARN/System.err(4519):     at com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:67)
07-11 19:00:34.871: WARN/System.err(4519):     at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:52)
07-11 19:00:34.871: WARN/System.err(4519):     at com.google.gson.Gson.fromJson(Gson.java:551)
07-11 19:00:34.871: WARN/System.err(4519):     at com.google.gson.Gson.fromJson(Gson.java:498)
07-11 19:00:34.871: WARN/System.err(4519):     at com.google.gson.Gson.fromJson(Gson.java:441)
07-11 19:00:34.871: WARN/System.err(4519):     at com.nuvotv.main.ScheduleListingActivity.onCreate(ScheduleActivity.java:28)
07-11 19:00:34.871: WARN/System.err(4519):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-11 19:00:34.871: WARN/System.err(4519):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-11 19:00:34.881: WARN/System.err(4519):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2519)
07-11 19:00:34.881: WARN/System.err(4519):     at android.app.ActivityThread.access$2200(ActivityThread.java:123)
07-11 19:00:34.881: WARN/System.err(4519):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1870)
07-11 19:00:34.881: WARN/System.err(4519):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-11 19:00:34.881: WARN/System.err(4519):     at android.os.Looper.loop(Looper.java:123)
07-11 19:00:34.881: WARN/System.err(4519):     at android.app.ActivityThread.main(ActivityThread.java:4370)
07-11 19:00:34.881: WARN/System.err(4519):     at java.lang.reflect.Method.invokeNative(Native Method)

В чем проблема в моем коде?

Ответы [ 2 ]

0 голосов
/ 11 июля 2011

В чем проблема в моем коде?

Вы пытаетесь десериализовать структуру данных Java, которая не соответствует структуре JSON.Более конкретно, вы пытаетесь десериализовать Java, который является объектом, который содержит список из JSON, который является списком.

объект со списком! = Список

Ниже приведен рабочий пример использованиятот же JSON, что и в оригинальном вопросе.

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.lang.reflect.Type;
import java.net.URI;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

public class Foo
{
  public static void main(String[] args) throws Exception
  {
    Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
    Type programsListType = new TypeToken<List<Program>>() {}.getType();
    Reader reader = new InputStreamReader(getJSONData("http://stage.sitv.com/api/v1/getScheduleByDate?date=2011-07-04"));
    List<Program> programs = gson.fromJson(reader, programsListType);
    System.out.println(gson.toJson(programs));
  }

  static InputStream getJSONData(String url)
  {
    DefaultHttpClient httpClient = new DefaultHttpClient();
    URI uri;
    InputStream data = null;
    try
    {
      uri = new URI(url);
      HttpGet method = new HttpGet(uri);
      HttpResponse response = httpClient.execute(method);
      data = response.getEntity().getContent();
      InputStream modData = data;
      //Log.i("MY INFO", "data: " + slurp(modData));
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }

    return data;
  }
}

class Program
{
  private String id;
  private String startTime;
  private String endTime;
  private String showDate;
  private String title;
  private String episodeTitle;
  private String description;
  private String duration;
  private String showLink;
  private String genre;
  private String archived;
}
0 голосов
/ 11 июля 2011

Полагаю, ProgramList objs = gson.fromJson (ScheduleListingReader, ProgramList.class); ожидает Array, и вы передаете ScheduleListingReader. К какому типу относится ScheduleListingReader?

Проверьте это GSON

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...