您的位置:首页 > Web前端 > JavaScript

灵活组装Json的数据使用Gson的JsonParser和JsonReader解析Json详解例子

2015-05-21 00:23 741 查看
2015-05-21 00:23
2273人阅读 评论(0)
收藏
举报



分类:
Java(13)


package com.app.json;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

import net.sf.json.JSONArray;

import com.app.entity.duapp.Address;

import com.google.gson.Gson;

import com.google.gson.JsonArray;

import com.google.gson.JsonElement;

import com.google.gson.JsonObject;

import com.google.gson.JsonParser;

/**

*@DEMO:napp

*@Author:jilongliang

*@Date:2013-7-20

*/

public class JsonParse {

private static Gson gson=new Gson();

/**

* 通过JsonLib把数组转换成Json数据

* @param url

* @throws Exception

*/

private static JSONArray getArrayToJsonByJsonLib()throws Exception

{

JSONArray jsonArr=null;

List<Address> lists=new ArrayList<Address>();

for (int i = 1; i <=12; i++) {

Address addr = new Address();

addr.setProvince("第"+i+"个省份");

addr.setCity("第"+i+"个城市");

addr.setCityCode("130"+i);

addr.setStreet("街道"+i);

addr.setStreetNumber("街道号码"+i);

lists.add(addr);

}

jsonArr = JSONArray.fromObject(lists); //把对象转换成Json对象

return jsonArr;

}

public static void main(String[] args)throws Exception{

getJsonGson();

}

/**

* 利用Json-lib封装数组Json数据,Gson解析Json数据.

* @throws Exception

*/

private static void getJsonGson() throws Exception {

//Json-lib的JSONArray数组对象

JSONArray JsonArray =getArrayToJsonByJsonLib();

String jsonData=JsonArray.toString();

/*

* 自己组装成一个json格式,格式必须为{,,}才能为JsonElement对象的parse方法解析不是否则

* 会报错com.google.gson.JsonSyntaxException: java.io.EOFException: End of input at line 1 column 1307

*/

String json="{status:1,address:"+jsonData+"}";

// 创建一个JsonParser

JsonParser parser = new JsonParser();

JsonElement jsonEl = parser.parse(json);

JsonObject jsonObj = null;

jsonObj = jsonEl.getAsJsonObject();//转换成Json对象

String status=jsonObj.get("status").getAsString();//status节点

//System.out.println(status);

JsonElement addressEl=jsonObj.get("address");//address节点

if(addressEl.isJsonArray()){//判断是否为Json数组

JsonArray jsonArray= addressEl.getAsJsonArray();//转为数组

for(Iterator iter=jsonArray.iterator();iter.hasNext();){

JsonObject obj=(JsonObject) iter.next();

//String city=obj.get("city").getAsString();//方法一:根据key形势取值

Address add=gson.fromJson(obj, Address.class);//方法二:灵活使用Gson取数据

System.out.println(add.getProvince()+"\t"+add.getCity());

}

}

}

}

json数据是由运行JsonRead类可以生成

Java代码


{

"info":

{

"users":{"username":"liangjilong","email":"jilongliang@sina.com","tel":"12396878","age":"25"},

"address":{"street":"棠东","province":"广东省","district":"天河区","city":"广州市"}

}

}

JsonRead

Java代码


package com.app.json;

import java.io.IOException;

import java.io.InputStream;

import java.io.StringReader;

import java.util.HashMap;

import java.util.Map;

import com.google.gson.Gson;

import com.google.gson.stream.JsonReader;

/**

*@DEMO:napp

*@Author:jilongliang

*@Date:2013-7-20

*/

public class JsonRead {

private static Gson gson=new Gson();

/**

* @param args

*/

public static void main(String[] args) throws Exception{

getJsonData();

//方法二

//String pathname="src/config/doc/json";

//InputStream input = new FileInputStream(new File(pathname));

//readJsonData(input,null);

}

/**

* 组装Json数据

* @throws Exception

*/

private static void getJsonData() throws Exception {

/**

* 组装address对象的数据

*/

Map<String, String> address = new HashMap <String, String>();

address.put("province", "广东省");

address.put("city", "广州市");

address.put("district", "天河区");

address.put("street", "棠东");

/**

* 组装users对象的数据

*/

Map<String, String> users = new HashMap <String, String>();

users.put("username", "liangjilong");

users.put("age", "25");

users.put("tel", "12396878");

users.put("email", "jilongliang@sina.com");

Map<Object, Object> listsObj = new HashMap <Object, Object>();

listsObj.put("address",address);//address节点

listsObj.put("users",users);//users节点

Object obj=listsObj;//转换成对象

Map<Object, Object> info = new HashMap <Object, Object>();

info.put("info", obj);//json的根节点

String json=gson.toJson(info);//转换成json数据

System.out.println(json);//打印json数据

readJsonData(null,json);

}

/**

* 从文件读取json数据

* @param in

* @throws Exception

*/

public static void readJsonData(InputStream in,String json) throws Exception {

//JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));

JsonReader reader = new JsonReader(new StringReader(json));

try {

reader.beginObject();

String tagName = reader.nextName();

if (tagName.equals("info")) {

readInfo(reader);

}

reader.endObject();

} finally {

reader.close();

}

}

/**

* 读取json的父(根,第一个)节点

* @param reader

* @throws Exception

*/

public static void readInfo(JsonReader reader) throws Exception {

reader.beginObject();

while (reader.hasNext()) {

String tagName = reader.nextName();

if (tagName.equals("address")) {

readAddress(reader);

} else if (tagName.equals("users")) {

readUsers(reader);

}

}

reader.endObject();

}

/**

* 读取用户信息值

* @param reader

* @throws IOException

*/

public static void readUsers(JsonReader reader) throws IOException {

reader.beginObject();

while (reader.hasNext()) {

String tag = reader.nextName();

if (tag.equals("username")) {

String username = reader.nextString();

System.out.println("用户名:" + username);

} else if (tag.equals("email")) {

String email = reader.nextString();

System.out.println("Email:" + email);

} else if (tag.equals("tel")) {

String tel = reader.nextString();

System.out.println("电话:" + tel);

}else if (tag.equals("age")) {

String age = reader.nextString();

System.out.println("年龄:" + age);

} else {

reader.skipValue();//忽略值/跳过break

}

}

reader.endObject();

}

/**

* 读取地区值

* @param reader

* @throws IOException

*/

public static void readAddress(JsonReader reader) throws IOException {

reader.beginObject();

while (reader.hasNext()) {

String tag = reader.nextName();

if (tag.equals("province")) {

String province = reader.nextString();

System.out.println("省份:" + province);

} else if (tag.equals("city")) {

String city = reader.nextString();

System.out.println("街道:" + city);

} else if (tag.equals("street")) {

String street = reader.nextString();

System.out.println("街道:" + street);

}else if (tag.equals("district")) {

String district = reader.nextString();

System.out.println("区:" + district);

} else {

reader.skipValue();//忽略值/跳过break

}

}

reader.endObject();

}

}

实体类:

Java代码


package com.app.entity.duapp;

import java.io.Serializable;

import com.google.gson.annotations.Expose;

/**

* 使用 new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

* 创建Gson对象,没有@Expose注释的属性将不会被序列化

* serialize序列化 默认 true

* deserialize反序列化 默认 true

*

*/

public class Address implements Serializable{

@Expose(serialize=false)// 序列化 /类已经序列化

private String streetNumber;

@Expose(deserialize=false)// 反序列化

private String street;

private String district;

private String city;

private String province;

private String cityCode;

public String getCityCode() {

return cityCode;

}

public void setCityCode(String cityCode) {

this.cityCode = cityCode;

}

public String getStreetNumber() {

return streetNumber;

}

public void setStreetNumber(String streetNumber) {

this.streetNumber = streetNumber;

}

public String getStreet() {

return street;

}

public void setStreet(String street) {

this.street = street;

}

public String getDistrict() {

return district;

}

public void setDistrict(String district) {

this.district = district;

}

public String getCity() {

return city;

}

public void setCity(String city) {

this.city = city;

}

public String getProvince() {

return province;

}

public void setProvince(String province) {

this.province = province;

}

}

json数据.zip (319 Bytes)

From: http://jilongliang.iteye.com/blog/1910882
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: