提问人:iamlukeyb 提问时间:3/8/2012 最后编辑:Timiamlukeyb 更新时间:8/13/2019 访问量:576218
如何在 Android 中解析 JSON?[复制]
How do I parse JSON in Android? [duplicate]
答:
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\"}]"
那么你应该使用如下图所示,而不是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
}
}
评论
4赞
Stan
2/19/2013
也可能有一种情况,当你收到一个 JSONArray,如果你尝试 JSONObject jObject = new JSONObject(result) - 你会得到一个关于解析的解释。在这种情况下,JSONArray jArray = new JSONArray(result) 将起作用。
25赞
www.9android.net
2/19/2013
#3
编写 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 类获取并遍历每个 json 项。下面我正在创建一个类的实例并使用 for 循环,我正在遍历每个 json 项,最后将每个 json 数据存储在变量中。
JSONObject
JSONParser
// 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的过程
评论