Android版的Json GSON舞会 [英] Android Json GSon prom
问题描述
我试图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屋!