Android版的Json GSON舞会 [英] Android Json GSon prom

查看:132
本文介绍了Android版的Json GSON舞会的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图GSON解析JSON。这里是我的code:

 公共类ProgramList {        私人列表<程序>程式;        公开名单<程序> getPrograms(){
            返回程序;
        }        公共无效setPrograms(列表<程序>程序){
            this.programs =方案;
        }
    }    公共类节目{
        私人字符串ID;
        私人字符串的startTime;
        私人字符串结束时间;
        私人字符串showdate相​​似;
        私人字符串称号;
        私人字符串episodeTitle;
        私人字符串描述;
        私人字符串期限;
        私人字符串showLink;
        私人字符串类型;
        私人字符串归档;        公共字符串的getID(){
            返回ID;
        }
        公共无效SETID(字符串ID){
            this.id = ID;
        }
        公共字符串getStartTime(){
            返回的startTime;
        }
        公共无效setStartTime(字符串的startTime){
            this.startTime =的startTime;
        }
        公共字符串getEndTime(){
            返回结束时间;
        }
        公共无效setEndTime(字符串结束时间){
            this.endTime =结束时间;
        }
        公共字符串getShowDate(){
            返回showdate相​​似;
        }
        公共无效setShowDate(字符串showdate相​​似){
            this.showDate = showdate相​​似;
        }
        公共字符串的getTitle(){
            返回称号;
        }
        公共无效的setTitle(字符串名称){
            this.title =称号;
        }
        公共字符串getEpisodeTitle(){
            返回episodeTitle;
        }
        公共无效setEpisodeTitle(字符串episodeTitle){
            this.episodeTitle = episodeTitle;
        }
        公共字符串getDescription(){
            返回描述;
        }
        公共无效setDescription(字符串描述){
            this.description =描述;
        }
        公共字符串getDuration(){
            返回时间;
        }
        公共无效setDuration(字符串长){
            this.duration =持续时间;
        }
        公共字符串getShowLink(){
            返回showLink;
        }
        公共无效setShowLink(字符串showLink){
            this.showLink = showLink;
        }
        公共字符串getGenre(){
            返回流派;
        }
        公共无效setGenre(字符串流派){
            this.genre =流派;
        }
        公共字符串getArchived(){
            返回存档;
        }
        公共无效setArchived(字符串归档){
            this.archived =存档;
        }
    }    InputStream的getJSONData(字符串URL){
            DefaultHttpClient的HttpClient =新DefaultHttpClient();
            URI URI;
            InputStream的数据= NULL;
            尝试{
                URI =新的URI(URL);
                HTTPGET方法=新HTTPGET(URI);
                HTT presponse响应= httpClient.execute(法);
                数据= response.getEntity()的getContent()。
                InputStream的modData =数据;
                //Log.i(\"MY信息,数据:+啜(modData));
            }赶上(例外五){
                e.printStackTrace();
            }            返回的数据;
    }    公共类ScheduleActivity延伸活动{
        / **当第一次创建活动调用。 * /
        @覆盖
        公共无效的onCreate(捆绑savedInstanceState){
            super.onCreate(savedInstanceState);
            的setContentView(R.layout.main);    读者ScheduleListingReader =新的InputStreamReader(getJSONData(http://stage.sitv.com/api/v1/getScheduleByDate?date=2011-07-04));    GSON GSON =新GSON();    ProgramList的OBJ = gson.fromJson(ScheduleListingReader,ProgramList.class);
}
}

现在,当我运行的应用程序,我收到以下错误:

  07-11 19:00:34.871:WARN / System.err的(4519):com.google.gson.JsonParseException:期待阵列,但找到的对象:com.nuvotv.model。 ProgramList @ 4597d758
07-11 19:00:34.871:WARN / System.err的(4519):在com.google.gson.JsonArrayDeserializationVisitor.startVisitingObject(JsonArrayDeserializationVisitor.java:89)
07-11 19:00:34.871:WARN / System.err的(4519):在com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:119)
07-11 19:00:34.871:WARN / System.err的(4519):在com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:67)
07-11 19:00:34.871:WARN / System.err的(4519):在com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:52)
07-11 19:00:34.871:WARN / System.err的(4519):在com.google.gson.Gson.fromJson(Gson.java:551)
07-11 19:00:34.871:WARN / System.err的(4519):在com.google.gson.Gson.fromJson(Gson.java:498)
07-11 19:00:34.871:WARN / System.err的(4519):在com.google.gson.Gson.fromJson(Gson.java:441)
07-11 19:00:34.871:WARN / System.err的(4519):在com.nuvotv.main.ScheduleListingActivity.onCreate(ScheduleActivity.java:28)
07-11 19:00:34.871:WARN / System.err的(4519):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-11 19:00:34.871:WARN / System.err的(4519):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-11 19:00:34.881:WARN / System.err的(4519):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2519)
07-11 19:00:34.881:WARN / System.err的(4519):在android.app.ActivityThread.access $ 2200(ActivityThread.java:123)
07-11 19:00:34.881:WARN / System.err的(4519):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1870)
07-11 19:00:34.881:WARN / System.err的(4519):在android.os.Handler.dispatchMessage(Handler.java:99)
07-11 19:00:34.881:WARN / System.err的(4519):在android.os.Looper.loop(Looper.java:123)
07-11 19:00:34.881:WARN / System.err的(4519):在android.app.ActivityThread.main(ActivityThread.java:4370)
07-11 19:00:34.881:WARN / System.err的(4519):在java.lang.reflect.Method.invokeNative(本机方法)

问题是什么在我的code?


解决方案

  

问题是什么在我的code?


您正在尝试反序列化到Java数据结构不匹配的JSON结构。更具体地讲,你要反序列化到Java的是包含JSON是列表的列表中的对象。

清单物件!=列表

使用相同的JSON作为原来的问题的工作示例以下。

 进口的java.io.InputStream;
进口java.io.InputStreamReader中;
进口的java.io.Reader;
进口java.lang.reflect.Type;
进口java.net.URI中;
进口的java.util.List;进口org.apache.http.Htt presponse;
进口org.apache.http.client.methods.HttpGet;
进口org.apache.http.impl.client.DefaultHttpClient;进口com.google.gson.FieldNamingPolicy;
进口com.google.gson.Gson;
进口com.google.gson.GsonBuilder;
进口com.google.gson.reflect.TypeToken;公共类Foo
{
  公共静态无效的主要(字串[] args)抛出异常
  {
    。GSON GSON =新GsonBuilder()setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
    键入programsListType =新TypeToken<列表与lt;程序>>(){} .getType();
    读卡器读卡器=新的InputStreamReader(getJSONData(http://stage.sitv.com/api/v1/getScheduleByDate?date=2011-07-04));
    清单<程序>程序= gson.fromJson(读卡器,programsListType);
    的System.out.println(gson.toJson(节目));
  }  静态的InputStream getJSONData(字符串URL)
  {
    DefaultHttpClient的HttpClient =新DefaultHttpClient();
    URI URI;
    InputStream的数据= NULL;
    尝试
    {
      URI =新的URI(URL);
      HTTPGET方法=新HTTPGET(URI);
      HTT presponse响应= httpClient.execute(法);
      数据= response.getEntity()的getContent()。
      InputStream的modData =数据;
      //Log.i(\"MY信息,数据:+啜(modData));
    }
    赶上(例外五)
    {
      e.printStackTrace();
    }    返回的数据;
  }
}类节目
{
  私人字符串ID;
  私人字符串的startTime;
  私人字符串结束时间;
  私人字符串showdate相​​似;
  私人字符串称号;
  私人字符串episodeTitle;
  私人字符串描述;
  私人字符串期限;
  私人字符串showLink;
  私人字符串类型;
  私人字符串归档;
}

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.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)

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

这篇关于Android版的Json GSON舞会的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆