Android之解析Json数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android之解析Json数据相关的知识,希望对你有一定的参考价值。

作用:网络传输格式。

JSON 语法规则

JSON 语法是 javascript 对象表示语法的子集。

  •    数据在键值对中
  •    数据由逗号分隔
  •    花括号保存对象
  •    方括号保存数组

JSON 名称/值对

JSON 数据的书写格式是:名称/值对。

基础结构  --> 重点

JSON[1] 结构有两种结构[2]

json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构

1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。

2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

经过对象、数组2种结构就可以组合成复杂的数据结构了。

详见:http://baike.baidu.com/link?url=Lv7Vzx9xA9TLfdyor81EN4kR3lxy-H2jwDc28BXHj6iaGnXwUeS7FiPmE0SVl9FZGiVisdO6exrpVaBTT_JL5a

步骤:

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数据的主要内容,如果未能解决你的问题,请参考以下文章

Android之解析Json数据

Android之JSON格式数据解析

android 解析数据之Gson

Android之JSON全面解析与使用

如何在android中将json数据加载到片段中

解析:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项