JSON
- 名称/值对数据表示
- 大括号持有的对象和每个名称后跟":"(冒号),名称/值对的分离,(逗号)
- 方括号持有数组和值,(逗号)分隔。
1 { 2 "book": [ 3 { 4 "id":"01", 5 "language": "Java", 6 "edition": "third", 7 "author": "Herbert Schildt" 8 }, 9 { 10 "id":"07", 11 "language": "C++", 12 "edition": "second" 13 "author": "E.Balagurusamy" 14 }] 15 }
JSON支持的数据类型:
类型 描述
Number 在JavaScript中的双精度浮点格式
String 双引号的反斜杠转义的Unicode
Boolean true 或 false
Array 值的有序序列
Value 它可以是一个字符串,一个数字,真的还是假(true/false),空(null )等
Object 无序集合键值对
Whitespace 可以使用任何一对中的令牌
null empty
<script language="javascript" > var JSONObj = { "Pascal" : [ { "Name" : "Pascal Made Simple", "price" : 700,"category":[p1,p2] }, { "Name" : "Guide to Pascal", "price" : 400,"category":[p1,p2] } ], "Scala" : [ { "Name" : "Scala for the Impatient", "price" : 1000 ,"category":[p1,p2]}, { "Name" : "Scala in Depth", "price" : 1300,"category":[p1,p2] } ]}; </script>
jquery支持的将字符串转Json对象方法:
第一种方式:
function strToJson(str){ var json = eval('(' + str + ')'); return json; }
第二种方式:使用JSON.parse需严格遵守JSON规范,如属性都需用引号引起来,没有用引号引起来用JSON.parse所有浏览器中均抛异常,解析失败。
function strToJson(str){ return JSON.parse(str); }
第三种方式:
function strToJson(str){ var jsonObj = $.parseJSON(JSONObj); return jsonObj ; }
JSON与Java应用:
json与java实体之间的映射由JSON.simple实体映射从左侧向右侧解码或解析
JSON Java
string java.lang.String
number java.lang.Number
true|false ava.lang.Boolean
array java.util.List( java.util.List的具体类是具体类 org.json.simple.JSONArray )
Object java.util.Map(java.util.Map 是org.json.simple.JSONObject)
null null
自定义JsonUtil类:(需要引入org.apache.commons.logging.jar文件的支持)
import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; public class JsonUtil { /** * 序列化对象为JSON格式 遵循JSON组织公布标准 * * @date 2008/05/07 * @version 1.0.0 */ /** Commons Logging instance. */ private static org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory .getLog(JsonUtil.class); /** * @param obj * 任意对象 * @return String */ public static String object2json(Object obj) { StringBuilder json = new StringBuilder(); if (obj == null) { json.append("\"\""); } else if (obj instanceof String || obj instanceof Integer || obj instanceof Boolean || obj instanceof Double || obj instanceof Long || obj instanceof Float || obj instanceof Integer || obj instanceof Character || obj instanceof Byte ) { json.append("\"").append(string2json(obj.toString())).append("\""); } else if (obj instanceof Object[]) { json.append(array2json((Object[]) obj)); } else if (obj instanceof List) { json.append(list2json((List<?>) obj)); } else if (obj instanceof Map) { json.append(map2json((Map<?, ?>) obj)); } else if (obj instanceof Set) { json.append(set2json((Set<?>) obj)); }else if (obj instanceof Date) { Date date =(Date) obj; SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); json.append("\"").append(sdf.format(date)).append("\""); } else { json.append(bean2json(obj)); } return json.toString(); } /** * @param bean * bean对象 * @return String */ public static String bean2json(Object bean) { StringBuilder json = new StringBuilder(); json.append("{"); PropertyDescriptor[] props = null; try { props = Introspector.getBeanInfo(bean.getClass(), Object.class) .getPropertyDescriptors(); } catch (IntrospectionException e) { } if (props != null) { for (int i = 0; i < props.length; i++) { try { String name = object2json(props[i].getName()); String value = object2json(props[i].getReadMethod().invoke( bean)); json.append(name); json.append(":"); json.append(value); json.append(","); } catch (Exception e) { log.error(e); } } json.setCharAt(json.length() - 1, '}'); } else { json.append("}"); } return json.toString(); } /** * @param list * list对象 * @return String */ public static String list2json(List<?> list) { StringBuilder json = new StringBuilder(); json.append("["); if (list != null && list.size() > 0) { for (Object obj : list) { json.append(object2json(obj)); json.append(","); } json.setCharAt(json.length() - 1, ']'); } else { json.append("]"); } return json.toString(); } /** * @param array * 对象数组 * @return String */ public static String array2json(Object[] array) { StringBuilder json = new StringBuilder(); json.append("["); if (array != null && array.length > 0) { for (Object obj : array) { json.append(object2json(obj)); json.append(","); } json.setCharAt(json.length() - 1, ']'); } else { json.append("]"); } return json.toString(); } /** * @param map * map对象 * @return String */ public static String map2json(Map<?, ?> map) { StringBuilder json = new StringBuilder(); json.append("{"); if (map != null && map.size() > 0) { for (Object key : map.keySet()) { json.append(object2json(key)); json.append(":"); json.append(object2json(map.get(key))); json.append(","); } json.setCharAt(json.length() - 1, '}'); } else { json.append("}"); } return json.toString(); } /** * @param set * 集合对象 * @return String */ public static String set2json(Set<?> set) { StringBuilder json = new StringBuilder(); json.append("["); if (set != null && set.size() > 0) { for (Object obj : set) { json.append(object2json(obj)); json.append(","); } json.setCharAt(json.length() - 1, ']'); } else { json.append("]"); } return json.toString(); } /** * @param s * 参数 * @return String */ public static String string2json(String s) { if (s == null) return ""; StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); switch (ch) { case '"': sb.append("\\\""); break; case '\\': sb.append("\\\\"); break; case '\b': sb.append("\\b"); break; case '\f': sb.append("\\f"); break; case '\n': sb.append("\\n"); break; case '\r': sb.append("\\r"); break; case '\t': sb.append("\\t"); break; case '/': sb.append("\\/"); break; default: if (ch >= '\u0000' && ch <= '\u001F') { String ss = Integer.toHexString(ch); sb.append("\\u"); for (int k = 0; k < 4 - ss.length(); k++) { sb.append('0'); } sb.append(ss.toUpperCase()); } else { sb.append(ch); } } } return sb.toString(); } }
使用jackson转换java类与json:
需要的Entity:
public class Student { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
用jackson转换java类与json的JsonUtils类:
import org.codehaus.jackson.map.ObjectMapper; public class JsonUtils { static ObjectMapper objectMapper; /** * 使用泛型方法,把json字符串转换为相应的JavaBean对象。 * 转换为普通JavaBean:readValue(json,Student.class) * 转换为List:readValue(json,List.class * ).但是如果我们想把json转换为特定类型的List,比如List<Student>,就不能直接进行转换了。 * 因为readValue(json,List * .class)返回其实是List<Map>类型,你不能指定readValue()的第二个参数是List<Student * >.class,所以不能直接转换。 * 我们可以把readValue()的第二个参数传递为Student[].class.然后使用Arrays.asList * ();方法把得到的数组转换为特定类型的List。 转换为Map:readValue(json,Map.class) 我们使用泛型,得到的也是泛型 * * @param content * 要转换的JavaBean类型 * @param valueType * 原始json字符串数据 * @return JavaBean对象 */ public static <T> T readValue(String content, Class<T> valueType) { if (objectMapper == null) { objectMapper = new ObjectMapper(); } try { return objectMapper.readValue(content, valueType); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 把JavaBean转换为json字符串 普通对象转换:toJson(Student) List转换:toJson(List) * Map转换:toJson(Map) 我们发现不管什么类型,都可以直接传入这个方法 * * @param object * JavaBean对象 * @return json字符串 */ public static String toJSon(Object object) { if (objectMapper == null) { objectMapper = new ObjectMapper(); } try { return objectMapper.writeValueAsString(object); } catch (Exception e) { e.printStackTrace(); } return null; } }
main方法测试类:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; public class Log4jTest { private static final Logger logger = Logger.getLogger(Log4jTest.class); public static void main(String[] args) { try { List<Student> list = new ArrayList<Student>(); Student s = new Student(); s.setName("小明"); s.setAge(11); Student s2 = new Student(); s2.setName("小红"); s2.setAge(22); list.add(s); list.add(s2); Map<String , String> map = new HashMap<String , String>(); map.put("1", "a"); map.put("2", "b"); map.put("3", "c"); /** * 使用jackson转换javaBean,list,map为json字符串 */ System.out.println(JsonUtils.toJSon(s)); System.out.println(JsonUtils.toJSon(list)); System.out.println(JsonUtils.toJSon(map)); String strJson = "{\"name\":\"小明\",\"age\":11}"; Student student = JsonUtils.readValue(strJson, Student.class); System.out.println(student.getName()+student.getAge()); System.out.println("****将Json字符串转换为List集合************"); String strJson1 = "[{\"name\":\"小明\",\"age\":\"11\"},{\"name\":\"小明\",\"age\":\"11\"}]"; System.out.println(JsonUtils.readValue(strJson1, List.class)); System.out.println("****将Json字符串转换为javaBean数组************"); String strJsonArr = "[{\"name\":\"小明\",\"age\":11},{\"name\":\"小明\",\"age\":11},{\"name\":\"小明\",\"age\":11}]"; Student[] studentArr = JsonUtils.readValue(strJsonArr, Student[].class); for (Student student2 : studentArr) { System.out.println(student2.getAge()); } System.out.println("****将Json字符串转换为Map集合************"); String strJsonMap = "{\"one\":{\"name\":\"小明\",\"age\":11},\"two\":{\"name\":\"小明\",\"age\":11},\"three\":{\"name\":\"小明\",\"age\":11}}"; Map<String,Map<String,Object>> jsonMap = JsonUtils.readValue(strJsonMap, Map.class); System.out.println(jsonMap); } catch (Exception e) { logger.error("This is debug message.",e); } } }
到这里下载代码:gitHub下载源代码 (记得在E:盘下建test.log文件记录log4j日志哦!)