Android数据解析之JSON

比起 XMLJSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如XML 直观。

假设有如下数据段

[{"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"}]

首先这里给出最为普通的方法(使用Google官方的JsonArray和JsonObject)

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("MainActivity", "id is " + id);
            Log.d("MainActivity", "name is " + name);
            Log.d("MainActivity", "version is " + version);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
在解析的时候,特别注意[]对应数组,{}则对应类

json数据的嵌套解析

在Tomcat下设置一个如下数据的页面,


[{object1:{object3:{id:'01',name:'google'}}},[{object2:{id:'33',name:'horizon'}}]]

显然的,这是一个大数组里面嵌套了多个类与数组,这里使用JSONArray和JSONObject进行解析

代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //tomcat下的数据源地址
        getData("http://10.0.2.2:8080/horizon/gson.html");
    }

    public void getData(String url) {
        //通过volley进行网络请求数据
        RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);

        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        parseJSONWithJSONObject(response.toString());
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });
        mQueue.add(jsonArrayRequest);
    }

    private void parseJSONWithJSONObject(String jsonData) {
        try {
            //获取最外层数组
            JSONArray jsonArray = new JSONArray(jsonData);
            //Array中获取Object
            JSONObject jsonObject = jsonArray.getJSONObject(0);
            JSONObject googleObject = jsonObject.getJSONObject("object1").getJSONObject("object3");
            String googleId = googleObject.getString("id");
            String googleName = googleObject.getString("name");
            //Array中获取Array
            JSONArray horizonArray = jsonArray.getJSONArray(1);
            JSONObject horizonObject = horizonArray.getJSONObject(0).getJSONObject("object2");
            String horizonId = horizonObject.getString("id");
            String horizonName = horizonObject.getString("name");
            
            Log.d("MainActivity", "googleId is " + googleId);
            Log.d("MainActivity", "googleName is " + googleName);
            Log.d("MainActivity", "horizonId is " + horizonId);
            Log.d("MainActivity", "horizonName is " + horizonName);
        } catch (JSONException e1) {
            e1.printStackTrace();
        }
    }
}

结果:

Android数据解析之JSON_第1张图片


仔细看看其实也不复杂,就是进行Array与Object的嵌套调用,但这看起来繁杂重复的劳动也是有必要省掉的,所以我们再来看看利用开源库的解析思路。


额。。。。,突然看到一篇道友写的GSON嵌套数据解析,非常详细,我就直接给地址了,GSON的嵌套解析。

在使用GSON解析的过程中,思路上还是很简单的,根据你所需要解析的数据情况,将其定义为一个类,然后通过fromjson方法获取该类对象即可。

Gson gson = new Gson();
java.lang.reflect.Type type = new TypeToken<JsonBean>() {}.getType();
JsonBean jsonBean = gson.fromJson(json, type);

上面的type既可以通过反射获取存储数据的结构的类型也可以直接传入定义完成的类名,即xxx.class以及类对象。


最后,推荐在数据解析方面使用阿里的fastjson开源库,号称目前最快的解析库,使用上也比较简单,和Gson基本类似,详情参见

https://github.com/alibaba/fastjson。有详细的使用文档和样例。

你可能感兴趣的:(android,gson,fastjson,数据解析,嵌套数据)