JSON

Android基础JSON数据的解析

字号+ 作者:H5之家 来源:H5之家 2017-11-17 08:00 我要评论( )

上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础----XMl数据的解析)。网络传输另外一种数据格式JSON就是我们今天要讲的,它是比

  • > 移动开发 > Android > 正文
  • 编程大巴
  • Android基础>JSON数据的解析

    作者:  发布日期:2016-03-18 20:01:23

    Tag标签:基础  数据  

  •   上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析)。网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据格式,在网络上传输的时候可以更省流量。JSON解析的框架有很多,我们就讲使用JSONObject和Gson两种,好了我们开始Json的讲解。

    目录导航:

     JSONObject常见的使用  JSONObject的实现原理  Gson常见的使用  JSON的使用实例  友情链接 JSONObject的使用

     一、 JSON对象的使用:

    String content = '{'username': 'linux', 'password': '123456'}'; JSONObject jsonObject = new JSONObject(content); String username = jsonObject.getString('username'); String password = jsonObject.getString('password');

    二、 JSON数组的使用:

    String jsonContent = '[{'user': '刘力', 'age': 21, 'femal': true}, '                         + '{'user': 'chen', 'age': 20, 'femal': false}]'; JSONArray jsonArray = new JSONArray(jsonContent); for (int i = 0; i < jsonArray.length(); i++) {       JSONObject object = jsonArray.getJSONObject(i);       System.out.print(object.getString('user') + ' ');       System.out.print(object.getInt('age') + ' ');       System.out.print(object.getBoolean('femal') + ' ');       System.out.println(); }

    三、 JSON数组与JSON对象混合使用

    String jsonString = '[{'user': 'tomhu', 'age': 21, ' + ''info': {'adress': 'hubai', 'sex': 'femal'}}, ' + '{'user': 'chen', 'age': 20, ' + ''info': {'adress': 'hunan', 'sex': 'male'}}]'; JSONArray jsonArrays = new JSONArray(jsonString); for (int i = 0; i < jsonArrays.length(); i++) { JSONObject objects = jsonArrays.getJSONObject(i); System.out.print(objects.getString('user') + ' '); System.out.print(objects.getInt('age') + ' '); System.out.print(objects.getJSONObject('info').getString('adress') + ' '); System.out.print(objects.getJSONObject('info').getString('sex') + ' '); System.out.println(); }

    四、 JSON数组中存储对象

    Person person = new Person(); person.setUsername('linux' ); person.setPassword('123456' ); JSONArray jsonArray = new JSONArray(); jsonArray.put(0, person ); jsonArray.put(1, 'I love you' ); // String username = jsonArray.getJSONObject(0).getString('username'); 错误的写法 Person user = (Person) jsonArray.get(0); System.out.println('username: ' + user.getUsername()); JSONObject的原理 JsonObject的存储与取出

    一、 JSONObject里面维护了一个LinkedHashMap,当生成一个无参数的JSONObject,实质是初始化了一个Map:

    private final LinkedHashMap<String, Object> nameValuePairs; public JSONObject() { nameValuePairs = new LinkedHashMap<String, Object>(); }

     二、 当JSONObject增加数据,实质上把数据的键值对方法存放在上述的Map中:

    public JSONObject put(String name, boolean value) throws JSONException { nameValuePairs.put(checkName(name), value); return this; }

    三、 从JSONObject中取出数据,很容易想到的就是从Map取出了:

    public String getString(String name) throws JSONException { Object object = get(name); // get()方法就是执行Object result = nameValuePairs.get(name); String result = JSON.toString(object); if (result == null) { throw JSON.typeMismatch(name, object, 'String'); } return result; } JsonObject的解析过程

    一、 JsonObject还有一个带参数的构造函数:常用的是传递一个String类型的参数

    public JSONObject(String json) throws JSONException { this(new JSONTokener(json)); }

    二、 跟进去,发现主要执行的是JSONTokener的nextValue()方法,在这个方法中主要是对数据进行解析;

    public Object nextValue() throws JSONException { int c = nextCleanInternal(); switch (c) { case -1: throw syntaxError('End of input'); case '{': return readObject(); case '[': return readArray(); case ''': case ''': return nextString((char) c); default: pos--; return readLiteral(); } } 在nextCleanInternal方法中,它会从头到尾的逐个字符的解析,对于一些字符做一些处理。例如空格,换行,转义符等! 当解析到[表示开始一个对象的读取,当解析到{表示一个数组的读取

    三、 在readObject方法中,仍然是调用nextCleanInternal()方法,逐个得到解析的字符,下到解析到}.下面贴出重要代码

    int first = nextCleanInternal(); // 得到解析的字符 if (first == '}') { return result; } else if (first != -1) { pos--; } ....... while (true) { Object name = nextValue(); // 解析得到键 int separator = nextCleanInternal(); if (separator != ':' && separator != '=') { throw syntaxError('Expected ':' after ' + name); } if (pos < in.length() && in.charAt(pos) == '>') { pos++; } result.put((String) name, nextValue()); // 将解析得到的键值对,存放在map当中 switch (nextCleanInternal()) { case '}': return result; case ';': case ',': continue; default: throw syntaxError('Unterminated object'); } }

     

  • 1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • jquery (ajax)post 的json数据 action中如何获取?

      jquery (ajax)post 的json数据 action中如何获取?

      2017-11-17 11:00

    • android和php通过httpget协议获取json数据

      android和php通过httpget协议获取json数据

      2017-11-16 18:27

    • 关于JSON类型数据查询

      关于JSON类型数据查询

      2017-11-16 12:04

    • handlerexceptionresolver 返回json

      handlerexceptionresolver 返回json

      2017-11-16 09:21

    网友点评