在Android中如何解析JSON?

184

如何在Android中解析JSON数据?


1
不了解Android,但在普通的Java中我使用这个:http://code.google.com/p/google-gson/ 编辑:在Android下也可以使用: http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html - James Bennet
2
SDK中嵌入了一个JSON解析器。请参见http://developer.android.com/reference/org/json/package-summary.html。 - njzk2
https://dev59.com/bnE85IYBdhLWcg3wXCIv#2840873 - Dipin
您可以查看下面的链接,使用Retrofit获取数据。http://www.tatnorix.in/how-to-get-json-data-using-get-retrofit-in-android/ - Tatson Baptista
你也可以在Android中使用Gson:https://github.com/google/gson - secret paladin
显示剩余2条评论
3个回答

265

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数值

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
    }
}

4
有时候你会接收到一个JSONArray,如果你尝试使用JSONObject jObject = new JSONObject(result)进行解析,就会出现解析异常。这种情况下,应该使用JSONArray jArray = new JSONArray(result)来解析。 - Stan

25
  • 编写 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(在此示例中)。

    2.1.将所有这些节点名称存储在变量中:在联系人的json中,我们有诸如姓名、电子邮件、地址、性别和电话号码之类的项目。因此,首先要做的是将所有这些节点名称存储在变量中。打开你的主活动类并声明将所有节点名称存储在静态变量中。

  • // 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. 使用解析器类(parser class)获取 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();
    }
    

    1
    这个答案有点忽略了在主线程之外下载JSON的问题。 - OneCricketeer

    16

    我已经为您编写了一个简单的示例,并对源代码进行了注释。该示例展示了如何获取实时的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获取有关如何提取所需数据的详细信息。


    嗨,我已经把这个放进去了,但是出现了错误。我已经导入了所有东西,但仍然遇到问题。 - iamlukeyb
    你需要在上面的代码块中加入try-catch语句,我已经修改了代码以反映这一点。 - Ljdawson
    如果检索到的文件具有换行符,则readLine()会失败。 - kazinix

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接