解析和生成JSON数据
2013-10-10 20:57
288 查看
/article/4548240.html什么是json?一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。前面几章讲到了xml的解析和生成,本章讲解下json的解析和生成首先我们看下json和xml的异同处1.JSON和XML的数据可读性基本相同2.JSON和XML同样拥有丰富的解析手段3.JSON相对于XML来讲,数据的体积小4.JSON与JavaScript的交互更加方便5.JSON对数据的描述性比XML较差6.JSON的速度要远远快于XMLJSON解析类可以分为以下几个类JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External: 应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的Key和Value被冒号":"分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之间是以逗号","分隔。Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object 。JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个 JSONStringer实体只能对应创建一个JSON text。。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。 JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如: [value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为, get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。JSONTokener:json解析类 JSONException:json中用到的异常一、构建json首先 我们来构建一个下面的简单的json/**
* 生成json
* */
public String createJson() {
// TODO Auto-generated method stub
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", "1");
jsonObject.put("name", "李磊");
jsonObject.put("age", "30");
return jsonObject.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return"";
}
得到的json数据为:{"id":"1","name":"李磊","age":"30"}这应该算是最简单的一个json数据实现的流程就是新建一个jsonobject对象,通过put将属性添加到json接下来 我们来创建一个带有数组的json数据/**
* 生成json
* */
public String createJson() {
// TODO Auto-generated method stub
List<Person> persons = getTestValues();
try {
JSONObject jsonObject = new JSONObject();
JSONArray array = new JSONArray();
for (int i = 0; i < persons.size(); i++) {
JSONObject person = new JSONObject();
Person p = persons.get(i);
person.put("id", p.getId());
person.put("name", p.getName());
person.put("age", p.getAge());
array.put(person);
}
jsonObject.put("persons", array);
System.out.println(jsonObject.toString());
return jsonObject.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return"";
}
上面的代码 我们得到的是这样的数据{"persons":[{"id":"1","age":"30","name":"李磊"},{"id":"2","age":"25","name":"韩梅梅"}]}看了代码之后就会发现 代码很容易理解
我们除了使用jsonObject和jsonArray来创建json之外 我们还可以使用JSONStringer/**
* 生成json
* */
public String createJson() {
// TODO Auto-generated method stub
JSONStringer jsonStringer = new JSONStringer();
try {
jsonStringer.object();
jsonStringer.key("id").value("1");
jsonStringer.key("name").value("李磊");
jsonStringer.key("age").value("30");
jsonStringer.endObject();
System.out.println(jsonStringer.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonStringer.toString();
}
上面的代码 我们得到了这样的数据{"id":"1","name":"李磊","age":"30"}和第一次获取的一块 接下来 我们讲下大概
好了 接下来我们使用JSONStringer创建一个带有数组的json数据/**
* 生成json
* */
public String createJson() {
// TODO Auto-generated method stub
List<Person> persons = getTestValues();
JSONStringer jsonStringer = new JSONStringer();
try {
jsonStringer.object();
jsonStringer.key("persons");
jsonStringer.array();
for (int i = 0; i < persons.size(); i++) {
Person person = persons.get(i);
jsonStringer.object();
jsonStringer.key("id").value(person.getId());
jsonStringer.key("name").value(person.getName());
jsonStringer.key("age").value(person.getAge());
jsonStringer.endObject();
}
jsonStringer.endArray();
jsonStringer.endObject();
System.out.println(jsonStringer.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonStringer.toString();
}
看下生成的字符串{"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韩梅梅","age":"25"}]}是我们需要的数据
上面的代码我们讲了怎么去生成json数据二、解析JSON接下来我们来解析一个最简单的json数据 数据为{"id":"1","name":"李磊","age":"30"}我们来看下解析的代码/**
* 解析json
* */
public Person parserJson() {
// TODO Auto-generated method stub
String json = "{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"}";
Person person = new Person();
try {
JSONTokener jsonTokener = new JSONTokener(json);
// 此时还未读取任何json文本,直接读取就是一个JSONObject对象。
// 如果此时的读取位置在"name" : 了,那么nextValue就是"李磊"(String)
JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
person.setId(jsonObject.getString("id"));
person.setName(jsonObject.getString("name"));
person.setAge(jsonObject.getString("age"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return person;
}
我们解析的步骤
当然 nextValue()获取的不一定是jsonObject对象,详细解释看代码注释接下来 我们要来解析这样的数据,带有数组哦~{"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韩梅梅","age":"25"}]}不难 上代码public List<Person> parserJson() {
// TODO Auto-generated method stub
String json = "{\"persons\":[{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"},{\"id\":\"2\",\"name\":\"韩梅梅\",\"age\":\"25\"}]}";
List<Person> persons = new ArrayList<Person>();
try {
JSONTokener jsonTokener = new JSONTokener(json);
// 此时还未读取任何json文本,直接读取就是一个JSONObject对象。
// 如果此时的读取位置在"name" : 了,那么nextValue就是"李磊"(String)
JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
JSONArray array = jsonObject.getJSONArray("persons");
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
Person person = new Person();
person.setId(object.getString("id"));
person.setName(object.getString("name"));
person.setAge(object.getString("age"));
persons.add(person);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return persons;
}
同样的 我们来解释下代码
* 生成json
* */
public String createJson() {
// TODO Auto-generated method stub
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("id", "1");
jsonObject.put("name", "李磊");
jsonObject.put("age", "30");
return jsonObject.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return"";
}
得到的json数据为:{"id":"1","name":"李磊","age":"30"}这应该算是最简单的一个json数据实现的流程就是新建一个jsonobject对象,通过put将属性添加到json接下来 我们来创建一个带有数组的json数据/**
* 生成json
* */
public String createJson() {
// TODO Auto-generated method stub
List<Person> persons = getTestValues();
try {
JSONObject jsonObject = new JSONObject();
JSONArray array = new JSONArray();
for (int i = 0; i < persons.size(); i++) {
JSONObject person = new JSONObject();
Person p = persons.get(i);
person.put("id", p.getId());
person.put("name", p.getName());
person.put("age", p.getAge());
array.put(person);
}
jsonObject.put("persons", array);
System.out.println(jsonObject.toString());
return jsonObject.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return"";
}
上面的代码 我们得到的是这样的数据{"persons":[{"id":"1","age":"30","name":"李磊"},{"id":"2","age":"25","name":"韩梅梅"}]}看了代码之后就会发现 代码很容易理解
1.创建最外层的{}对象jsonObject 2.创建数组对象 用来保存两个人的信息 3.在循环内创建jsonObject对象 用来保存每个人的信息,别忘了添加完属性之后 将对象添加到数组 4.将数组添加到最外层对象 |
* 生成json
* */
public String createJson() {
// TODO Auto-generated method stub
JSONStringer jsonStringer = new JSONStringer();
try {
jsonStringer.object();
jsonStringer.key("id").value("1");
jsonStringer.key("name").value("李磊");
jsonStringer.key("age").value("30");
jsonStringer.endObject();
System.out.println(jsonStringer.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonStringer.toString();
}
上面的代码 我们得到了这样的数据{"id":"1","name":"李磊","age":"30"}和第一次获取的一块 接下来 我们讲下大概
1. 首先 新建JSONStringer对象 2. 调用object()方法 说明开始创建 添加了头{(当然,要和endobject成对出现) 3. 添加一个属性 通过key("name") 添加了属性了名称 通过value("value") 添加了属性的值 4. 添加完所有内容之后,调用endobject()方法通知json创建完毕 |
* 生成json
* */
public String createJson() {
// TODO Auto-generated method stub
List<Person> persons = getTestValues();
JSONStringer jsonStringer = new JSONStringer();
try {
jsonStringer.object();
jsonStringer.key("persons");
jsonStringer.array();
for (int i = 0; i < persons.size(); i++) {
Person person = persons.get(i);
jsonStringer.object();
jsonStringer.key("id").value(person.getId());
jsonStringer.key("name").value(person.getName());
jsonStringer.key("age").value(person.getAge());
jsonStringer.endObject();
}
jsonStringer.endArray();
jsonStringer.endObject();
System.out.println(jsonStringer.toString());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonStringer.toString();
}
看下生成的字符串{"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韩梅梅","age":"25"}]}是我们需要的数据
1.创建一个新的JSONStringer对象 用来存储生成的json数据 2.首先调用key("persons") 添加数组的key值 3.调用array()通知系统 接下来的是一个数组 (和endarray()一起出现) 4.在循环内部通过object()方法 创建一对{} 然后将属性添加到大括号内 |
* 解析json
* */
public Person parserJson() {
// TODO Auto-generated method stub
String json = "{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"}";
Person person = new Person();
try {
JSONTokener jsonTokener = new JSONTokener(json);
// 此时还未读取任何json文本,直接读取就是一个JSONObject对象。
// 如果此时的读取位置在"name" : 了,那么nextValue就是"李磊"(String)
JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
person.setId(jsonObject.getString("id"));
person.setName(jsonObject.getString("name"));
person.setAge(jsonObject.getString("age"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return person;
}
我们解析的步骤
1.将json字符串转换为jsonTokener对象 2.调用jsonTokener的nextValue()方法 将json数据转换为jsonObject对象 3.通过getString(keyname)获取需要的值 |
// TODO Auto-generated method stub
String json = "{\"persons\":[{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"},{\"id\":\"2\",\"name\":\"韩梅梅\",\"age\":\"25\"}]}";
List<Person> persons = new ArrayList<Person>();
try {
JSONTokener jsonTokener = new JSONTokener(json);
// 此时还未读取任何json文本,直接读取就是一个JSONObject对象。
// 如果此时的读取位置在"name" : 了,那么nextValue就是"李磊"(String)
JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
JSONArray array = jsonObject.getJSONArray("persons");
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
Person person = new Person();
person.setId(object.getString("id"));
person.setName(object.getString("name"));
person.setAge(object.getString("age"));
persons.add(person);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return persons;
}
同样的 我们来解释下代码
1.创建一个list 用来存储解析的信息 2.将json字符串转换为jsonTokener对象,再转换为jsonObject对象 3.通过getJSONArray("persons")获取json数组 4.通过循环来解析json数组,解析的内容不解释,上面已经说过 |
相关文章推荐
- fastjson生成和解析json数据
- GSON方式生成和解析json数据
- java分享第十三天(fastjson生成和解析json数据,序列化和反序列化数据)
- GSON方式生成和解析json数据
- FastJson生成和解析JSON数据
- fastjson生成和解析json数据,序列化和反序列化数据
- JSON解析类库之Jackson(1) --- Jackson类库学习, 生成与解析json数据,json字符串与Java对象互转
- json数据解析和生成
- 如何使用JSON Framework库解析与生成json数据(iphone网络篇二)
- fastjson生成和解析json数据,序列化和反序列化数据
- jstree获取整棵树的json数据,并且不用解析可以直接生成新的树
- JSON数据的生成和解析
- Json 数据的解析 ,生成
- FastJson生成和解析JSON数据
- 【Android网络开发の4】解析和生成JSON数据
- 利用gson解析和生成json数据(一)
- GSON方式生成和解析json数据
- Android配置文件分享和JSON数据生成与解析
- GSON方式生成和解析json数据
- Android解析JSON方式 服务器端生成JSON数据--很好的例子