我如何在 Android 中解析 JSON?

我 如 何 在 Android 中 解 析 JSON ?

可以使用gson
,也可以使用jackson

Android 拥有解析 json 内置所需的所有工具。 示例如下,不需要 GSON 或类似的东西。
得到 JSON:

DefaultHttpClient   httpclient = new DefaultHttpClient(new BasicHttpParams());HttpPost httppost = new HttpPost(http://someJSONUrl/jsonWebService);// Depends on your web service
httppost.setHeader("Content-type", "application/json");
InputStream inputStream = null;String result = null;try {
    HttpResponse response = httpclient.execute(httppost);           
    HttpEntity entity = response.getEntity();
    inputStream = entity.getContent();
    // json is UTF-8 by default
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null)
    {
        sb.append(line + "\n");
    }
    result = sb.toString();} catch (Exception e) { 
    // Oops}finally {
    try{if(inputStream != null)inputStream.close();}catch(Exception squish){}}

现在有了 JSON,还是不管用
创建一个JSONObject:
JSONObject jObject = new JSONObject(result);
获取特定的字符串
String aJsonString = jObject.getString("STRINGNAME");
得到一个特定的布尔值
boolean aJsonBoolean = jObject.getBoolean("BOOLEANNAME");
得到一个特定的整数
int aJsonInteger = jObject.getInt("INTEGERNAME");
得到一个特定的长度
long aJsonLong = jObject.getLong("LONGNAME");
得到一个特定的替身
double aJsonDouble = jObject.getDouble("DOUBLENAME");
得到一个特定的 JSONArray:
JSONArray jArray = jObject.getJSONArray("ARRAYNAME");
从数组中获取

for (int i=0; i < jArray.length(); i++){
    try {
        JSONObject oneObject = jArray.getJSONObject(i);
        // Pulling items from the array
        String oneObjectsItem = oneObject.getString("STRINGNAMEinTHEarray");
        String oneObjectsItem2 = oneObject.getString("anotherSTRINGNAMEINtheARRAY");
    } catch (JSONException e) {
        // Oops
    }}

编写 JSON 解析器类

public class JSONParser {
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    // constructor
    public JSONParser() {}
    public JSONObject getJSONFromUrl(String url) {
        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
        // return JSON String
        return jObj;
    }}

解析 JSON 数据一旦创建了解析器类,下一步就是知道如何使用该类。 下面我将解释如何使用解析器类解析 json (在本例中使用)。
将所有这些节点名存储在变量中: 在联系人 json 中,我们有姓名、电子邮件、地址、性别和电话号码等项。 因此,首先要将所有这些节点名存储在变量中。 打开主活动类并将所有节点名存储在静态变量中。

// url to make requestprivate static String url = "http://api.9android.net/contacts";
// JSON Node namesprivate static final String TAG_CONTACTS = "contacts";private static final String TAG_ID = "id";private static final String TAG_NAME = "name";private static final String TAG_EMAIL = "email";private static final String TAG_ADDRESS = "address";private static final String TAG_GENDER = "gender";private static final String TAG_PHONE = "phone";private static final String TAG_PHONE_MOBILE = "mobile";private static final String TAG_PHONE_HOME = "home";private static final String TAG_PHONE_OFFICE = "office";
// contacts JSONArrayJSONArray contacts = null;

使用解析器类获取 JSONObject 并遍历每个 json 项。 下面我将创建一个 JSONParser 类的实例,并使用 for 循环遍历每个 json 项,最后将每个 json 数据存储在变量中。

// Creating JSON Parser instanceJSONParser jParser = new JSONParser();
// getting JSON string from URLJSONObject json = jParser.getJSONFromUrl(url);
    try {
    // Getting Array of Contacts
    contacts = json.getJSONArray(TAG_CONTACTS);
    // looping through All Contacts
    for(int i = 0; i < contacts.length(); i++){
        JSONObject c = contacts.getJSONObject(i);
        // Storing each json item in variable
        String id = c.getString(TAG_ID);
        String name = c.getString(TAG_NAME);
        String email = c.getString(TAG_EMAIL);
        String address = c.getString(TAG_ADDRESS);
        String gender = c.getString(TAG_GENDER);

        // Phone number is agin JSON Object
        JSONObject phone = c.getJSONObject(TAG_PHONE);
        String mobile = phone.getString(TAG_PHONE_MOBILE);
        String home = phone.getString(TAG_PHONE_HOME);
        String office = phone.getString(TAG_PHONE_OFFICE);
    }} catch (JSONException e) {
    e.printStackTrace();}

我已经为您编写了一个简单的示例,并对源代码进行了注释。这个例子展示了如何获取 live json 并将其解析为 JSONObject 以进行细节提取:

try{
    // Create a new HTTP Client
    DefaultHttpClient defaultClient = new DefaultHttpClient();
    // Setup the get request
    HttpGet httpGetRequest = new HttpGet("http://example.json");

    // Execute the request in the client
    HttpResponse httpResponse = defaultClient.execute(httpGetRequest);
    // Grab the response
    BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
    String json = reader.readLine();

    // Instantiate a JSON object from the request response
    JSONObject jsonObject = new JSONObject(json);
} catch(Exception e){
    // In your production code handle any errors and catch the individual exceptions
    e.printStackTrace();}

一旦获得了 JSONObject,请参考 SDK 以获取关于如何提取所需数据的详细信息。