Android之解析Json数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android之解析Json数据相关的知识,希望对你有一定的参考价值。
作用:网络传输格式。
JSON 语法规则
JSON 语法是 javascript 对象表示语法的子集。
- 数据在键值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
JSON 名称/值对
JSON 数据的书写格式是:名称/值对。
基础结构 --> 重点
json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构
1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
经过对象、数组2种结构就可以组合成复杂的数据结构了。
步骤:
1.搭建服务器,给Json数据。
2.解析数据。
详细步骤:
1.搭建服务器,给Json数据。
[{"id":"5","version":"5.5","name":"Angry Birds"},
{"id":"6","version":"7.0","name":"Clash of Clans"},
{"id":"7","version":"3.5","name":"Hey Day"}]
2.解析数据。
try { // 数组的解析 JSONArray jsonArray = new JSONArray(jsonData); for (int i = 0; i < jsonArray.length(); i++) { // 对象的解析 JSONObject jsonObject = jsonArray.getJSONObject(i); String id = jsonObject.getString("id"); String name = jsonObject.getString("name"); String version = jsonObject.getString("version"); Log.d("h_bl", "id is " + id); Log.d("h_bl", "name is " + name); Log.d("h_bl", "version " + version); } } catch (Exception e) { e.printStackTrace(); }
详细代码:
@SuppressLint("HandlerLeak") public class MainActivity extends Activity implements OnClickListener { private Button bt_getData; private TextView tv_show_data; private static final int GET_DATA_OK = 0; // Handler机种更新UI private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case GET_DATA_OK: String data = (String) msg.obj; tv_show_data.setText(data); break; default: break; } super.handleMessage(msg); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { bt_getData = (Button) findViewById(R.id.bt_getData); tv_show_data = (TextView) findViewById(R.id.tv_show_data); bt_getData.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.bt_getData: getData(); break; default: break; } } /** * 获取数据 */ private void getData() { new Thread(new Runnable() { @Override public void run() { Log.d("h_bl", "进入执行"); HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet("http://h-bolin.imwork.net/SendJsonData/SendJson.json"); HttpResponse httpResponse = null; try { httpResponse = httpClient.execute(httpGet); if (httpResponse.getStatusLine().getStatusCode() == 200) { // 请求和响应都成功了 Log.d("h_bl", "响应成功"); HttpEntity entity = httpResponse.getEntity(); String response = EntityUtils.toString(entity, "utf-8"); parseJSONWithJSONObject(response); Message message = new Message(); message.what = GET_DATA_OK; // 将服务器返回的结果存放到Message中 message.obj = response.toString(); handler.sendMessage(message); } } catch (ClientProtocolException e) { Log.d("h_bl", "链接失败"); e.printStackTrace(); } catch (IOException e) { Log.d("h_bl", "链接IO异常"); e.printStackTrace(); } } }).start(); } private void parseJSONWithJSONObject(String jsonData) { try { // 数组的解析 JSONArray jsonArray = new JSONArray(jsonData); for (int i = 0; i < jsonArray.length(); i++) { // 对象的解析 JSONObject jsonObject = jsonArray.getJSONObject(i); String id = jsonObject.getString("id"); String name = jsonObject.getString("name"); String version = jsonObject.getString("version"); Log.d("h_bl", "id is " + id); Log.d("h_bl", "name is " + name); Log.d("h_bl", "version " + version); } } catch (Exception e) { e.printStackTrace(); } } }
GSON的使用:
1.对象
比如说一段 JSON 格式的数据如下所示:
{"name":"Tom","age":20}
那我们就可以定义一个 Person 类,并加入 name 和 age 这两个字段,然后只需简单地调
用如下代码就可以将 JSON 数据自动解析成一个 Person 对象了:
Gson gson = new Gson(); Person person = gson.fromJson(jsonData, Person.class);
2.数组
JSON 数组需要借助 TypeToken 将期望解析成的数据类型传入到 fromJson()方法中,如下所示:
Gson gson = new Gson();
List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());
TypeToken:
由于Java泛型的实现机制,使用了泛型的代码在运行期间相关的泛型参数的类型会被擦除,我们无法在运行期间获知泛型参数的具体类型(所有的泛型类型在运行时都是Object类型)。
但是有的时候,我们确实需要获知泛型参数的类型,比如将使用了泛型的Java代码序列化或者反序列化的时候,这个时候问题就变得比较棘手。
由于在运行期间无法得知泛型参数的类型,对这个类的对象进行序列化和反序列化都不能正常进行。Gson通过借助TypeToken类来解决这个问题。
只要将需要获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,就可以通过getType()方法获取到我们使用的泛型类的泛型参数类型。
详见:
http://www.cnblogs.com/qq78292959/p/3781814.html
以上是关于Android之解析Json数据的主要内容,如果未能解决你的问题,请参考以下文章