json的学习笔记
json比较简单,所以先从json开始学起。
一 json的名称:
json的全称是javascript object notation,中文名称为js 对象表示法。
json的定义:json是一种轻量级的数据交换格式,具有良好的可读和快速编写的特性。,可以在不同平台间进行数据交换。json采用兼容性很高的文本格式,同时也具备类似于c语言体系的行为。--json.org
二 json的实例和结构:
一个简单的json实例:
{ "employees": [ { "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName":"Thomas" , "lastName":"Carter" } ] }
对该例子的分析如下:
(1)json和js中的对象很像,都是用一个{}来作为边界,用[]来表示是数组。
(2)json包含的内容是键值对(key/value)形式,无序的。
(3)json 具有自我描述的特性。
(4)json的多个属性由逗号隔开,最后一个不需要再加逗号。
三 json的语法规则:
JSON 语法是 JavaScript 对象表示法语法的子集。
- 数据在名称/值对中
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
四 json的值:
JSON 值可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
五 json转换成js对象:
创建包含 JSON 语法的 JavaScript 字符串:
var txt = '{ "employees" : [' + '{ "firstName":"Bill" , "lastName":"Gates" },' + '{ "firstName":"George" , "lastName":"Bush" },' + '{ "firstName":"Thomas" , "lastName":"Carter" } ]}';
由于 JSON 语法是 JavaScript 语法的子集,JavaScript 函数 eval() 可用于将 JSON 文本转换为 JavaScript 对象。
eval() 函数使用的是 JavaScript 编译器,可解析 JSON 文本,然后生成 JavaScript 对象。必须把文本包围在括号中,这样才能避免语法错误:
var obj = eval ("(" + txt + ")");
六 json在java中的应用:
package com.jelly.json.test;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.util.JSONUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.junit.Test;
import com.jelly.json.entity.MyBean;
import com.jelly.json.entity.Person;
import com.jelly.json.entity.Student;
@SuppressWarnings("unchecked")
public class JsonTest {
private static void setDataFormat2JAVA(){
//设定日期转换格式
JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss"}));
}
//json转成Object
@Test
public void testJsonToObj(){
String json = "{id:'1001',name:'张三',age:22}";
Student stu = null;
setDataFormat2JAVA();
JSONObject obj = JSONObject.fromObject(json);
stu = (Student)JSONObject.toBean(obj, Student.class);
System.out.println(stu);
}
//从一个JSON数组得到一个java对象数组
@Test
public void testJsonArrToArray(){
String jsonStus = "[{id:1,name:'jack',age:20},{id:2,name:'rose',age:20},{id:3,name:'admin',age:20}]";
JSONArray array = JSONArray.fromObject(jsonStus);
Student[] stu = new Student[array.size()];
for(int i = 0; i < array.size(); i++){
JSONObject jsonObject = array.getJSONObject(i);
stu[i] = (Student)JSONObject.toBean(jsonObject, Student.class);
}
System.out.println(stu[0]);
System.out.println(stu[1]);
System.out.println(stu[2]);
//System.out.println(stu[3]); 会报错
}
//从一个JSON数组得到一个java集合
@Test
public void testJsonArrToList(){
String jsonStus = "[{id:1,name:'jack',age:20},{id:2,name:'rose',age:20},{id:3,name:'admin',age:20}]";
JSONArray array = JSONArray.fromObject(jsonStus);
List<Student> stu = new ArrayList<Student>();
for(int i = 0; i < array.size(); i++){
JSONObject jsonObject = array.getJSONObject(i);
stu.add((Student)JSONObject.toBean(jsonObject, Student.class));
}
System.out.println(stu.get(0));
System.out.println(stu.get(1));
System.out.println(stu.get(2));
}
//从json数组中得到相应java数组
@Test
public void testArrayForJson(){
String jsonString = "['q','c','d']";
JSONArray jsonArray = JSONArray.fromObject(jsonString);
Object[] strs = jsonArray.toArray();
System.out.print(strs[0]);
System.out.print(strs[1]);
System.out.print(strs[2]);
}
//字符串转换成json
@Test
public void testJsonStrToJSON(){
String json = "['json','is','easy']";
JSONArray jsonArray = JSONArray.fromObject( json );
System.out.println( jsonArray );
// prints ["json","is","easy"]
}
//Map转换成json
@Test
public void testMapToJSON(){
Map map = new HashMap();
map.put( "name", "jack" );
map.put( "bool", Boolean.TRUE );
map.put( "int", new Integer(1) );
map.put( "arr", new String[]{"a","b"} );
map.put( "func", "function(i){ return this.arr[i]; }" );
JSONObject jsonObject = JSONObject.fromObject( map );
System.out.println( jsonObject );
}
//java对象转换为json格式
@Test
public void testObjToJson(){
JSONObject obj2=new JSONObject();
obj2.put("phone","123456");
obj2.put("zip","7890");
obj2.put("contact",obj2);
System.out.print(obj2);
}
//复合类型bean转成成json
@Test
public void testBeadToJSON(){
MyBean bean = new MyBean();
bean.setId("001");
bean.setName("银行卡");
bean.setDate(new Date());
List cardNum = new ArrayList();
cardNum.add("农行");
cardNum.add("工行");
cardNum.add("建行");
cardNum.add(new Person("test"));
bean.setCardNum(cardNum);
JSONObject jsonObject = JSONObject.fromObject(bean);
System.out.println(jsonObject);
}
//一般数组转换成JSON
@Test
public void testArrayToJSON(){
boolean[] boolArray = new boolean[]{true,false,true};
JSONArray jsonArray = JSONArray.fromObject( boolArray );
System.out.println( jsonArray );
}
//Collection对象转换成JSON
@Test
public void testListToJSON(){
List list = new ArrayList();
list.add( "first" );
list.add( "second" );
JSONArray jsonArray = JSONArray.fromObject( list );
System.out.println( jsonArray );
// prints ["first","second"]
}
//普通类型的json转换成对象
@Test
public void testJsonToObject() throws Exception{
String json = "{name=\"json\",bool:true,int:1,double:2.2,func:function(a){ return a; },array:[1,2]}";
JSONObject jsonObject = JSONObject.fromObject( json );
System.out.println(jsonObject);
Object bean = JSONObject.toBean( jsonObject );
assertEquals( jsonObject.get( "name" ), PropertyUtils.getProperty( bean, "name" ) );
assertEquals( jsonObject.get( "bool" ), PropertyUtils.getProperty( bean, "bool" ) );
assertEquals( jsonObject.get( "int" ), PropertyUtils.getProperty( bean, "int" ) );
assertEquals( jsonObject.get( "double" ), PropertyUtils.getProperty( bean, "double" ) );
assertEquals( jsonObject.get( "func" ), PropertyUtils.getProperty( bean, "func" ) );
System.out.println(PropertyUtils.getProperty(bean, "name"));
System.out.println(PropertyUtils.getProperty(bean, "bool"));
System.out.println(PropertyUtils.getProperty(bean, "int"));
System.out.println(PropertyUtils.getProperty(bean, "double"));
System.out.println(PropertyUtils.getProperty(bean, "func"));
System.out.println(PropertyUtils.getProperty(bean, "array"));
List arrayList = (List)JSONArray.toCollection(jsonObject.getJSONArray("array"));
for(Object object : arrayList){
System.out.println(object);
}
}
}