如何在 Android 中解析 JSON?

如何在 Android 中解析 JSON 提要?

564547 次浏览

我为您编写了一个简单的示例,并对源代码进行了注释。这个例子展示了如何获取 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,了解如何提取你需要的数据的详细信息。

Android 拥有解析内置 json 所需的所有工具。下面是一个例子,不需要 GSON 或者类似的东西。

得到你的 JSON:

假设您有一个 json 字符串

String result = "{\"someKey\":\"someValue\"}";

创建一个 JSONObject:

JSONObject jObject = new JSONObject(result);

如果 json 字符串是一个数组,例如:

String result = "[{\"someKey\":\"someValue\"}]"

那么您应该使用如下所示的 JSONArray而不是 JSONObject

获取特定的字符串

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
}
}
  1. 编写 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;
    
    
    }
    }
    
  2. Parsing JSON Data
    Once you created parser class next thing is to know how to use that class. Below i am explaining how to parse the json (taken in this example) using the parser class.

    2.1. Store all these node names in variables: In the contacts json we have items like name, email, address, gender and phone numbers. So first thing is to store all these node names in variables. Open your main activity class and declare store all node names in static variables.

    // url to make request
    private static String url = "http://api.9android.net/contacts";
    
    
    // JSON Node names
    private 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 JSONArray
    JSONArray contacts = null;
    

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

    // Creating JSON Parser instance
    JSONParser jParser = new JSONParser();
    
    
    // getting JSON string from URL
    JSONObject 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();
    }