开发者

Android Json GSon prom

开发者 https://www.devze.com 2023-03-19 22:48 出处:网络
i am trying to GSOn for parsing JSON. Here is my code: public class ProgramList { private List<Program> programs;

i am trying to GSOn for parsing JSON. Here is my code:

    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);
}
}

Now when I am running the app, I am getting following error:

    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.callActivityOnC开发者_如何学Goreate(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)

What is the problem in my code?


What is the problem in my code?

You're trying to deserialize to a Java data structure that does not match the JSON structure. More specifically, you're trying to deserialize to Java that is an object that contains a list from JSON that is a list.

object with list != list

Following is a working example using the same JSON as in the original question.

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;
}


i suppose the ProgramList objs = gson.fromJson(ScheduleListingReader, ProgramList.class); expects Array, and you pass ScheduleListingReader. What type is ScheduleListingReader?

Check this out GSON

0

精彩评论

暂无评论...
验证码 换一张
取 消