本文共 4125 字,大约阅读时间需要 13 分钟。
日常开发过程中,时常需要查验程序运行时对象的内容。对象结构简单时,我们可以通过重写Object的toString方法实现,但是对于那些含有复合类型的对象,上述方法就不能很好应对了。
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。
数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
//定义一个符合数据类型,内含各种基本类型和集合类型public class Person { private String name; private int age; private Listaddress; private String[] phoneNums; private Boolean isMarried; private List friends = new ArrayList (); 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 getAddress() { return address; } public void setAddress(List 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 getFriends() { return friends; } public void setFriends(List 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); Listaddress1 = new ArrayList (); 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 address2 = new ArrayList (); 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 address3 = new ArrayList (); 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文本,可以使用如下代码自定义解析
Mapmap = JSON.parseObject(p1JsonStr, new TypeReference
上述代码将JSON文本按照Map
JSON文本的转换重点在于文本格式是否合法,因此在使用前务必保证文本格式符合规范。