android解析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"); } }

四、 nextValue方法比较关键,它流转解析的大部分工作!在nextValue中有一个readLiteral方法,针对一些类型做处理,得到解析之后的结果:

private Object readLiteral() throws JSONException { String literal = nextToInternal("{}[]/\\:,=;# \t\f"); if (literal.length() == 0) { throw syntaxError("Expected literal value"); } else if ("null".equalsIgnoreCase(literal)) { return JSONObject.NULL; } else if ("true".equalsIgnoreCase(literal)) { return Boolean.TRUE; } else if ("false".equalsIgnoreCase(literal)) { return Boolean.FALSE; } /* try to parse as an integral type... */ if (literal.indexOf('.') == -1) { int base = 10; String number = literal; if (number.startsWith("0x") || number.startsWith("0X")) { number = number.substring(2); base = 16; } else if (number.startsWith("0") && number.length() > 1) { number = number.substring(1); base = 8; } try { long longValue = Long.parseLong(number, base); if (longValue <= Integer.MAX_VALUE && longValue >= Integer.MIN_VALUE) { return (int) longValue; } else { return longValue; } } catch (NumberFormatException e) { /* * This only happens for integral numbers greater than * Long.MAX_VALUE, numbers in exponential form (5e-10) and * unquoted strings. Fall through to try floating point. */ } } /* ...next try to parse as a floating point... */ try { return Double.valueOf(literal); } catch (NumberFormatException ignored) { } /* ... finally give up. We have an unquoted string */ return new String(literal); // a new string avoids leaking memory }

五、至于JSONArray的解析与JsonObject的解析过程是一样的,它里面维护的是一个List:

private final List<Object> values; public JSONArray(JSONTokener readFrom) throws JSONException { Object object = readFrom.nextValue(); if (object instanceof JSONArray) { values = ((JSONArray) object).values; } else { throw JSON.typeMismatch(object, "JSONArray"); } }

Gson的使用

一、我们在测试当中先加入一个Person类,方便测试:

package com.tomhu.test; public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

二、 gson把对象转换成JSON格式

Gson gson = new Gson(); Person person = new Person(); person.setName("linux"); person.setAge(23); String str = gson.toJson(person); System.out.println(str);

打印结果:  {"name":"linux","age":23}

三、 gson把json格式解析成对象

String jsonData = "{'name':'刘力','age':19}"; Person person = gson.fromJson(jsonData, Person.class); System.out.println(person.getName() + ", " + person.getAge());

打印结果: 刘力, 19

四、 gson把List对象解析成Json格式:

Gson gson = new Gson(); List<Person> persons = new ArrayList<Person>(); for (int i = 0; i < 2; i++) { Person p = new Person(); p.setName("name" + i); p.setAge(i * 5); persons.add(p); } String str = gson.toJson(persons); System.out.println(str);

打印结果: [{"name":"name0","age":0},{"name":"name1","age":5}]

五、 gson把Json格式解析成List对象:

Gson gson = new Gson(); String str = "[{'name':'linux','age':10},{'name':'huhx','age':22}]"; List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType()); for (int i = 0; i < ps.size(); i++) { Person person = ps.get(i); System.out.print("name: " + person.getName() + " age: " + person.getAge()); }

打印结果:name: linux age: 10 name: huhx age: 22

时间: 2024-10-03 06:22:30

android解析JSON数据的相关文章

Android解析JSON数据的方法分析_Android

本文实例讲述了Android解析JSON数据的方法.分享给大家供大家参考,具体如下: JSON作为一种"轻量"的数据结构传递数据,在JS中有广泛的应用 Google公司对JSON的解析提供了gson.jar这个包,它不依赖于其他任何JAR包:自从Android3.0中已经合入了该解析器的功能,但之前的版本是没有的. findViewById(R.id.parseBtn).setOnClickListener(new OnClickListener(){ @Override public

android解析JSON数据_Android

JSONObject的使用  一. JSON对象的使用: String content = "{'username': 'linux', 'password': '123456'}"; JSONObject jsonObject = new JSONObject(content); String username = jsonObject.getString("username"); String password = jsonObject.getString(&q

Android解析JSON数据的方法分析

本文实例讲述了Android解析JSON数据的方法.分享给大家供大家参考,具体如下: JSON作为一种"轻量"的数据结构传递数据,在JS中有广泛的应用 Google公司对JSON的解析提供了gson.jar这个包,它不依赖于其他任何JAR包:自从Android3.0中已经合入了该解析器的功能,但之前的版本是没有的. findViewById(R.id.parseBtn).setOnClickListener(new OnClickListener(){ @Override public

Android解析json数据示例代码(三种方式)

Json数据 复制代码 代码如下: [{"code":"110000","sheng":"11","di":"00","xian":"00","name":"北京市","level":1},{"code":"659004","sheng&q

探究Android系统中解析JSON数据的方式_java

前言喜欢在前言里讲一下自己的现状,或许能有共鸣的同学,更多的是留给自己一个纪念,几个月或者几年再回来看的时候还是会很有感慨.今天说说语言,json这种数据格式之前我做服务器端的时候天天接触,天真的以为json的世界里只有php的json_encode和json_decode,今天当我做客户端的时候,竟然将近一个多小时才搞定json的解析.这里我不是抨击php好坏,只是想说多学点东西,看看你不熟悉的领域,方能开阔自己的视野,方能知道天外有天,方能知道当初你看不上的工作其实你也不一定能很好的完成,扯

Android系列---JSON数据解析的实例_Android

上篇随笔详细介绍了三种解析服务器端传过来的xml数据格式,而对于服务器端来说,返回给客户端的数据格式一般分为html.xml和json这三种格式,那么本篇随笔将讲解一下json这个知识点,包括如何通过json-lib和gson这两个json解析库来对解析我们的json数据,以及如何在我们的Android客户端解析来自服务器端的json数据,并更新到UI当中. 一.什么是json json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格

json-Gson解析Json数据出现了异常

问题描述 Gson解析Json数据出现了异常 在用Gson解析如下Json的时候 String jsonStr = "{code:403,msg:无查询好友信息,result:[]}"; 解析代码为: Gson son = new Gson(): MessageInfo info = son.fromJson(jsonStr, MessageInfo.class); System.out.println(info.getCode()); System.out.println(info.

Android网络之数据解析----使用Google Gson解析Json数据

[正文] 文章回顾: Android网络之数据解析----SAX方式解析XML数据 一.Json数据的介绍                                                                                                                 Json(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JS的一个子集. Json采用完全独立于语言的文本格式,这使得Jso

我的Android进阶之旅------&amp;gt;解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题

1.问题描述 首先,需要解析的Json数据类似于下面的格式,但是包含了Java关键字abstract: { ret: 0, msg: "normal return.", news: [ { id: "NEW2016062800875700", from: "腾讯新闻客户端", qqnews_download_url: "http://inews.qq.com/m?refer=openapi_for_xiaotiancai",