你好,我很难弄清楚如何使用Java中的Gson创建一个对象。我遵循了一些在线链接到这里的一个指南,他们说必须将Json结构的每个部分作为类创建,但在创建对象时,我仍然得到一个null值。
Nodes nodes = gson.fromJson(obj.get("Nodes"), Nodes.class);节点给我一个空值。
如果有人能帮我指出我错过了什么,或者如果我创建错了我的课程,那将有很大的帮助。
下面是我要解析和创建对象的JSON结构:
{
"nodes":[
{
"node":{
"image_thumb":"/sites/all/themes/imsa/images/headlines-thumb.png",
"body_image":" <p>Test</p>\n ",
"title":"Test",
"link":"<a href=\"/articles/test\">view</a>",
"updated":"2013-11-12 11:52",
"body":"<p>Test</p>",
"type":"Article"
}
},
{
"node":{
"image_thumb":"/sites/all/themes/imsa/images/headlines-thumb.png",
"body_image":" <p>test</p>\n ",
"title":"Test Event",
"link":"<a href=\"/articles/test-event\">view</a>",
"updated":"2013-11-08 17:56",
"body":"<p>test</p>",
"type":"Article"
}
},
{
"node":{
"image_thumb":"/sites/all/themes/imsa/images/headlines-thumb.png",
"body_image":" <p>Atricle with no image</p>\n ",
"title":"No Image",
"link":"<a href=\"/articles/no-image\">view</a>",
"updated":"2013-11-01 16:39",
"body":"<p>Atricle with no image</p>",
"type":"Article"
}
},
{
"node":{
"image_thumb":"/sites/default/files/styles/square_thumbnail/public/field/image/test_cars_1.jpg",
"image_medium":"/sites/default/files/styles/media_gallery_thumbnail/public/field/image/test_cars_1.jpg",
"body_image":" <p style=\"text-align: justify; font-size: 11px; line-height: 14px; margin-bottom: 14px; font-family: Arial, Helvetica, sans;\">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur dapibus massa vitae mauris elementum dignissim. Etiam ut cursus nulla, at accumsan lacus. Vivamus semper massa ut lorem pulvinar, et porta magna commodo. Quisque tempus ligula eget nisi condimentum lobortis. Praesent in tincidunt massa. Fusce eleifend interdum justo a malesuada. Pellentesque eget condimentum mi, sed congue enim.</p>\n<p style=\"text-align: justify; font-size: 11px; line-height: 14px; margin-bottom: 14px; font-family: Arial, Helvetica, sans;\">Nam ornare pretium volutpat. Sed vitae dolor odio. Cras eleifend tellus at ultrices vehicula. Aenean luctus auctor hendrerit. Nullam egestas at lectus sed scelerisque. Aenean nec sagittis tellus. Aenean nec nibh non erat pellentesque hendrerit id sed quam. Phasellus id dapibus metus. Nunc ultricies enim vitae aliquet semper. Fusce eu mollis elit.</p>\n ",
"title":"Testing it Up",
"subtitle":"As we do",
"link":"<a href=\"/articles/testing-it\">view</a>",
"updated":"2013-10-31 13:31",
"body":"<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur dapibus massa vitae mauris elementum dignissim. Etiam ut cursus nulla, at accumsan lacus. Vivamus semper massa ut lorem pulvinar, et porta magna commodo. Quisque tempus ligula eget nisi condimentum lobortis. Praesent in tincidunt massa. Fusce eleifend interdum justo a malesuada. Pellentesque eget condimentum mi, sed congue enim.</p><p>Nam ornare pretium volutpat. Sed vitae dolor odio. Cras eleifend tellus at ultrices vehicula. Aenean luctus auctor hendrerit. Nullam egestas at lectus sed scelerisque. Aenean nec sagittis tellus. Aenean nec nibh non erat pellentesque hendrerit id sed quam. Phasellus id dapibus metus. Nunc ultricies enim vitae aliquet semper. Fusce eu mollis elit.</p>",
"type":"Article"
}
}
]
}下面是我创建的一个类,它发出一个http请求来返回Json数据,并尝试使用这里的Gson库创建一个基于返回的Json结构的对象。
private class NewsAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
String url = "http://imsa.com/series/united-sportscar/news.json/";
HttpGet getRequest = new HttpGet(url);
try{
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpResponse getResponse = httpClient.execute(getRequest);
final int statusCode = getResponse.getStatusLine().getStatusCode();
if(statusCode != HttpStatus.SC_OK) {
Log.w(getClass().getSimpleName(), "Error " + statusCode + " for URL " + url);
}
HttpEntity getResponseEntity = getResponse.getEntity();
InputStream httpResponseStream = getResponseEntity.getContent();
InputStreamReader inputStreamReader = new InputStreamReader(httpResponseStream);
JsonParser parser = new JsonParser();
JsonObject obj = parser.parse(inputStreamReader).getAsJsonObject();
Gson gson = new Gson();
Nodes nodes = gson.fromJson(obj.get("Nodes"), Nodes.class);
System.out.println(nodes.getNews());
}
catch (IOException e) {
getRequest.abort();
Log.w(getClass().getSimpleName(), "Error for URL " + url, e);
}
return null;
}下面是我要解析的组成Json结构的所有类:
节点类-
public class Nodes implements Serializable {
@SerializedName("nodes")
private final ArrayList<News> news;
public Nodes(final ArrayList<News> news) {
this.news = news;
}
public Nodes(final Nodes nodesToCopy) {
this.news = nodesToCopy.getNews();
}
public ArrayList<News> getNews() {
return news;
}
@Override
public String toString() {
return "Nodes{" +
"news=" + news +
'}';
}
}新闻课-
public class News {
@SerializedName("node")
ArrayList<NewsItem> news;
public News(ArrayList<NewsItem> news) {
this.news = news;
}
public ArrayList<NewsItem> getNews() {
return news;
}
@Override
public String toString() {
return "News{" +
"news=" + news +
'}';
}
}NewsItem类-
public class NewsItem implements Serializable {
@SerializedName("image_thumb")
private final String imageThumb;
@SerializedName("image_medium")
private final String imageMedium;
@SerializedName("body_image")
private final String bodyImage;
@SerializedName("title")
private final String title;
@SerializedName("link")
private final String link;
@SerializedName("updated")
private final Date updated;
@SerializedName("body")
private final Text body;
@SerializedName("type")
private final String type;
public NewsItem(String imageThumb, String imageMedium, String bodyImage, String title, String link, Date updated, Text body, String type) {
this.imageThumb = imageThumb;
this.imageMedium = imageMedium;
this.bodyImage = bodyImage;
this.title = title;
this.link = link;
this.updated = updated;
this.body = body;
this.type = type;
}
public NewsItem(final NewsItem newsItemToCopy) {
this.imageThumb = newsItemToCopy.getImageThumb();
this.imageMedium = newsItemToCopy.getImageMedium();
this.bodyImage = newsItemToCopy.getBodyImage();
this.title = newsItemToCopy.getTitle();
this.link = newsItemToCopy.getLink();
this.updated = newsItemToCopy.getUpdated();
this.body = newsItemToCopy.getBody();
this.type = newsItemToCopy.getType();
}
public String getImageThumb() {
return imageThumb;
}
public String getImageMedium() { return imageMedium; }
public String getBodyImage() {
return bodyImage;
}
public String getTitle() {
return title;
}
public String getLink() {
return link;
}
public Date getUpdated() {
return updated;
}
public Text getBody() {
return body;
}
public String getType() {
return type;
}
@Override
public String toString() {
return "NewsItem{" +
"imageThumb='" + imageThumb + '\'' +
", imageMedium='" + imageMedium + '\'' +
", bodyImage='" + bodyImage + '\'' +
", title='" + title + '\'' +
", link='" + link + '\'' +
", updated=" + updated +
", body=" + body +
", type='" + type + '\'' +
'}';
}
}发布于 2013-12-15 22:30:58
这里有很多错误,但它们相对容易解决。
第一
JsonParser parser = new JsonParser();
JsonObject obj = parser.parse(inputStreamReader).getAsJsonObject();obj现在包含完整的JSON。所以当你这么做
obj.get("Nodes")您将在整个JSON中获取名为nodes的数组对象。但是您的Nodes类需要它。因此,Gson将找不到任何东西,并将返回null。您需要将obj直接交给fromJson调用。
第二,每个node元素都是一个JSON对象
"node":{
"image_thumb":"/sites/all/themes/imsa/images/headlines-thumb.png",
"body_image":" <p>Test</p>\n ",
"title":"Test",
"link":"<a href=\"/articles/test\">view</a>",
"updated":"2013-11-12 11:52",
"body":"<p>Test</p>",
"type":"Article"
}不是JSON数组。因此,这
@SerializedName("node")
ArrayList<NewsItem> news;是错的。ArrayList假设一个数组结构,而不是一个元素。将此(以及变异器/访问器)更改为
@SerializedName("node")
NewsItem news;最后,您还没有设置Date格式,因此Gson将不知道如何反序列化
"2013-11-12 11:52"转换为Date对象。您可以设置自己的Date格式,并获得一个配置正确的Gson对象,如下所示
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm").create();https://stackoverflow.com/questions/20600471
复制相似问题