如何在 Android 中解析 JSON?[复制]

How do I parse JSON in Android? [duplicate]

提问人:iamlukeyb 提问时间:3/8/2012 最后编辑:Timiamlukeyb 更新时间:8/13/2019 访问量:576218

问:

如何在 Android 中解析 JSON Feed?

Android JSON 解析

评论

2赞 njzk2 3/8/2012
SDK 中嵌入了一个 JSON 解析器。查看 developer.android.com/reference/org/json/package-summary.html
0赞 Dipin Narayanan 3/8/2012
stackoverflow.com/a/2840873/643350
1赞 James Bennet 3/8/2012
不了解 Android,但在普通 Java 下我使用这个: code.google.com/p/google-gson 编辑:在 android 下工作:javacodegeeks.com/2011/01/...
0赞 Tatson Baptista 7/17/2018
您可以查看下面的链接,您可以在其中使用改造获取数据。tatnorix.in/how-to-get-json-data-using-get-retrofit-in-android
0赞 secret paladin 8/1/2018
您也可以在 android 中使用 gson:github.com/google/gson

答:

16赞 Ljdawson 3/8/2012 #1

我为您编写了一个简单的示例并注释了源代码。该示例展示了如何获取实时 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();
}

获得后,请参阅 SDK,了解有关如何提取所需数据的详细信息。JSONObject

评论

0赞 iamlukeyb 3/8/2012
嗨,我已经把它放进去了,但遇到错误,我已经导入了所有内容,但仍然遇到问题
0赞 Ljdawson 3/8/2012
您需要将上面的代码块包装在 try-catch 中,我已经编辑了代码以反映这一点。
0赞 kazinix 6/3/2013
如果检索到的文件包含换行符,则失败。readLine()
265赞 bbedward 3/8/2012 #2

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

获取 JSON:

假设你有一个 json 字符串

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

创建一个 JSONObject

JSONObject jObject = new JSONObject(result);

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

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

那么你应该使用如下图所示,而不是JSONArrayJSONObject

获取特定字符串

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

评论

4赞 Stan 2/19/2013
也可能有一种情况,当你收到一个 JSONArray,如果你尝试 JSONObject jObject = new JSONObject(result) - 你会得到一个关于解析的解释。在这种情况下,JSONArray jArray = new JSONArray(result) 将起作用。
25赞 www.9android.net 2/19/2013 #3
  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. 解析 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 类获取并遍历每个 json 项。下面我正在创建一个类的实例并使用 for 循环,我正在遍历每个 json 项,最后将每个 json 数据存储在变量中。JSONObjectJSONParser

    // 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赞 OneCricketeer 7/8/2018
这个答案在某种程度上跳过了从主线程下载JSON的过程