将Json转换为特定的类

时间:2012-12-05 15:47:29

标签: java android json wikipedia

我正在尝试从维基百科中检索文本以在Android应用上使用。我正在使用Java。 我要做的第一件事是从特定文章中检索部分,向用户显示这些部分,当用户点击一个部分时,使用另一个http请求获取部分文本。

所以,这两个请求是:

  

http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Valencia_Cathedral&prop=sections

然后这一个:

  

http://en.wikipedia.org/w/api.php?format=json&action=parse&page=Valencia_Cathedral&prop=text&section=1

我的问题是:我应该创建哪种类型的Java对象来存储信息,然后使用.fromJSON()将其转换为这些类?

感谢@NathanZ,我创建了这两个类:

public class WikiResponseSections {
    String title;
    List<Section> sections;
}

public class Section {
        int toclevel;
        String level;
        String line;
        String number;
        String index;
        String fromtitle;
        int byteoffset;
        String anchor;
}

但是,当我通过Gson将HTTP响应转换为这些objets,并尝试读取字段'title'的值时,会触发一个错误:JavaNullPointerException。 这是我的转换代码:

InputStream stream = null;
try {
    stream = entity.getContent();
} catch (IllegalStateException e) {
    Log.e("Stream","ERROR illegalstateexception");
} catch (IOException e) {
    Log.e("Stream","ERROR exception");
}
reader = new BufferedReader(new InputStreamReader(stream));
GsonBuilder bldr = new GsonBuilder();
Gson gson = bldr.create();
WikiResponse = gson.fromJson(reader, WikiResponseSections.class);
if (WikiResponse != null){
    Log.i("WikiResponse",WikiResponse.getTitle()); //The error triggers HERE
    publishProgress();
}
else
    Log.i("WikiResponse","NULL");
}

再次感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您可以使用Google's Gson库。 它的工作原理如下:

InputStream source = ...; // your code to get the Json from a url
Gson gson = new Gson();
Reader reader = new InputStreamReader(source);
MyResponse response = gson.fromJson(reader, MyResponse.class);

MyResponse是你的对象。创建MyResponse时,请为字段指定与Json字段相同的名称和类型

MyResponse类可以如下:

public class MyResponse{
    String title;
    ArrayList<sections>;
}

public class sections{
    int toclevel;
    String level;
    String line;
    String number;
    String fromtitle;
    long byteoffset;
    String anchor;
}



public class WikiResponseParse{
    Parse parse;
    public class Parse{
        String title, text;
    }
}

如果您不能使用json字段名称,因为它不符合Java:

添加以下导入:

import com.google.gson.annotations.SerializedName;

在你班上:

@SerializedName("*")
public String star;