JSON
JSON表示JavaScriptObject Noation,它与XML一样,也是用于数据交换的,是javascript的一个子集,独立与语言的文本格式,在跨平台中的数据传输有很大的优势。
JSON主要有两种数据结构形式:
一、 对象
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。(如图所示,图中表示数据的方式是类似非确定性自动机的形式,没学过编译原理的人,可能理解起来困难点,实际上也是正则表达式的形式。下同)
例如:{“name”:”zhangsan”,”sex”:”meal”,”age”:20}
二、 数组
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
例如:[“hello”,”world”,”good”,”well”]
对于对象和数组中value可以是一个字符串、数字、对象、数组、boolean(true/false)值、null。
在javascript中实例:
<scripttype="text/javascript" >
var people={"n01":
{
"name":{"firstName":"zhang","lastName":"san"},
"sex":"meal",
"age":20,
"graduation":true,
"hobby":["reading","football","sing"]
}
}
//对于一般取值直接用点运算,并且支持数组下表运算
//通过JSON.stringify()可以将一个javascript对象转换为JSON字符串的形式
//通过JSON.parse()可以将JSON字符串的形式转换为javascript对象,也可以通过eval函数进行转换:eval(‘(’+JSONString+’)’)
alert(people.n01.sex);//meal
alert(people.n01.name.firstName);//zhang
alert(people.n01.graduation);//true
people.n01.graduation=false;//还可以对对象进行修改
alert(people.n01.graduation);//false
alert(people.n01.hobby[0]);//reading
alert(JSON.stringify(people));//字符串形式的people
var obj=JSON.parse(JSON.stringify(people))
alert(obj);//javascript 对象
alert(obj.n01.sex)//meal
</script>
通过JSON字符串形式与javascript对象之间的转换,可以通过Ajax的responseText(而不是responseXML)来实现JSON格式的异步数据交换。
在java中也对JSON提供了支持,主要通过使用JSONObject和JSONArray两个类,需要在我们的项目中导入org.json这个包。
JSONObject处理我们JSON对象格式的数据,它可以接受一个字符串形式的JSON对象,也可以接受一个java 对象作为其构造函数(该对象类必须有set和get方法),并且可以通过一系列的get方法取值,put方法修改或添加值,remove删除操作 。
例如:
String jsonString="{'name':'zhangsan','age':20}";
//通过json字符串形式构造json对象
JSONObject jsonObject=new JSONObject(jsonString);
//jsonObject中实现了很多取值的方法
String name=jsonObject.getString("name");
int age=jsonObject.getInt("age");
System.out.println(name);
System.out.println(age);
jsonObject.put("sex", "meal");
jsonObject.remove("age");
jsonObject.put("sex", "unknown");
//获取key然后迭代取值
Iterator<String>iter=jsonObject.keys();
while(iter.hasNext())
{
System.out.println(jsonObject.get(iter.next()));
}
System.out.println("__________________________________________");
People p1=new People();
p1.setName("lisi");
p1.setAge(23);
//通过对象构造JSONObject
JSONObject jsonObject2=new JSONObject(p1);
System.out.println(jsonObject2.get("name"));
JSONArray对应于JSON数组格式数据的操作,它同样可以接受一个JSON数组格式的字符串作为其构造函数的参数,另外还可以接受一个Array数组作为构造参数。
实例:
jsonString="['zhangsan','lisi','wangwu']";
//通过json字符串形式构造json数字
JSONArray jsonArray=new JSONArray(jsonString);
//遍历json数组
for(inti=0;i<jsonArray.length();i++)
{
System.out.println(jsonArray.get(i));
}
JSONObject与JSONArray都实现了由一个字符串格式的JSON转换为java中JSONObject或JSONArray对象,但是并没有实现由对象向JSON数据格式的字符串转换。然而,GSON却对此做了很好支持,GSON是Google中的一个项目,我们在使用GSON需要导入com.google.gson包,GSON类通过toJson方法得到JSON数据格式的字符串和fromJson方法得到与JSON对应的java对象。
Gson gson = new Gson(); // Or use newGsonBuilder().create();
MyTypetarget = new MyType();//java Object
Stringjson = gson.toJson(target); // serializes target to Json
MyTypetarget2 = gson.fromJson(json, MyType.class); // deserializes json into target2
另外一种toJson方法还接受一个Type类型的参数,用于指定target的类型 ,可通过Type type=newTypeToken<MyType>(){}.getType()获得,使用该方法主要用于当被转换的对象含有至少一个类型参数和可能是一个数组。
个人经验感觉两种方法没什么区别。
实例:
People people=newPeople();
people.setName("zhangsan");
people.setSex("meal");
people.setAge(18);
people.setBirthday(new Date());
Gson gson=new Gson();
StringgsonString=gson.toJson(people);
System.out.println(gsonString);
Peoplep1=gson.fromJson(gsonString,People.class);
System.out.println(p1.getName());