JSON标准格式
背景
日常开发过程中,时常需要查验程序运行时对象的内容。对象结构简单时,我们可以通过重写Object的toString方法实现,但是对于那些含有复合类型的对象,上述方法就不能很好应对了。
JSON建构于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。
数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
JSON常用方法
- public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
- public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
- public static final T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean
- public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
- public static final List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合
- public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
- public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
- public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。
JSON示例
//定义一个符合数据类型,内含各种基本类型和集合类型
public class Person {
private String name;
private int age;
private List<String> address;
private String[] phoneNums;
private Boolean isMarried;
private List<Person> friends = new ArrayList<Person>();
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getAddress() {
return address;
}
public void setAddress(List<String> address) {
this.address = address;
}
public String[] getPhoneNums() {
return phoneNums;
}
public void setPhoneNums(String[] phoneNums) {
this.phoneNums = phoneNums;
}
public Boolean getMarried() {
return isMarried;
}
public void setMarried(Boolean married) {
isMarried = married;
}
public List<Person> getFriends() {
return friends;
}
public void setFriends(List<Person> friends) {
this.friends = friends;
}
//测试类
public class JSONTest {
public static void main(String[] args){
Person p1 = new Person();
p1.setName("Alex");
p1.setAge(21);
p1.setMarried(false);
String[] phoneNums1 = {"11111","22222"};
p1.setPhoneNums(phoneNums1);
List<String> address1 = new ArrayList<String>();
address1.add("aaaaa");
address1.add("bbbbb");
p1.setAddress(address1);
Person p2 = new Person();
p2.setName("Bob");
p2.setAge(22);
p2.setMarried(true);
String[] phoneNums2 = {"33333","44444"};
p2.setPhoneNums(phoneNums2);
List<String> address2 = new ArrayList<String>();
address2.add("ccccc");
address2.add("ddddd");
p2.setAddress(address2);
Person p3 = new Person();
p3.setName("Cathy");
p3.setAge(23);
p3.setMarried(false);
String[] phoneNums3 = {"55555","66666"};
p3.setPhoneNums(phoneNums2);
List<String> address3 = new ArrayList<String>();
address3.add("eeeee");
address3.add("fffff");
p3.setAddress(address3);
p1.getFriends().add(p2);
p1.getFriends().add(p3);
String p1JsonStr = JSON.toJSONString(p1, true);
System.out.println(p1JsonStr);
}
}
对于合格的JSON文本,可以使用如下代码自定义解析
Map<String,Object> map = JSON.parseObject(p1JsonStr, new TypeReference<Map<String, Object>>(){});
上述代码将JSON文本按照Map
总结
JSON文本的转换重点在于文本格式是否合法,因此在使用前务必保证文本格式符合规范。