赞
踩
目录
- {"name": "QinJiang"}
- {"age": "3"}
- {"sex": "男"}
- var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹
- 的
- var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个
- 字符串
- /*json转化为JavaScript*/
- var a = JSON.parse('{"a","hello"}')
- /*要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法*/
- var json = JSON.stringify({a: 'Hello', b: 'World'});
当数据在浏览器与服务器之间进行交换时,这些数据只能是文本。
JSON 属于文本,并且我们能够把任何 JavaScript 对象转换为 JSON,然后将 JSON 发送到服务器。
我们也能把从服务器接收到的任何 JSON 转换为 JavaScript 对象。
以这样的方式,我们能够把数据作为 JavaScript 对象来处理,无需复杂的解析和转译
JSON 语法衍生于 JavaScript 对象标记法语法:
JSON 数据写为名称/值对。
名称/值由字段名称构成,后跟冒号和值:
"name":"Bill Gates"
JSON 名称需要双引号。而 JavaScript 名称不需要。
JSON – 求值为 JavaScript 对象
JSON 格式几乎等同于 JavaScript 对象。
在 JSON 中,键必须是字符串,由双引号包围:
在 JSON 中,值必须是以下数据类型之一:
在 JavaScript 中,以上所列均可为值,外加其他有效的 JavaScript 表达式,包括:
在 JSON 中,字符串值必须由双引号编写:
在 JSON 中,值必须是以下数据类型之一:
JSON 的值不可以是以下数据类型之一:
JSON 中的字符串必须用双引号包围。
{ "name":"John" }
JSON 中的数字必须是整数或浮点数。
{ "age":30 }
JSON 中的值可以是对象。
{ "employee":{ "name":"Bill Gates", "age":62, "city":"Seattle" } }
JSON 中的值可以是数组。
{ "employees":[ "Bill", "Steve", "David" ] }
JSON 中的值可以是 true/false。
{ "sale":true }
{ "name":"Bill Gates", "age":62, "car":null }
JSON 对象被花括号 {} 包围。
JSON 对象以键/值对书写。
键必须是字符串,值必须是有效的 JSON 数据类型(字符串、数字、对象、数组、布尔或 null)。
键和值由冒号分隔。
每个键/值对由逗号分隔。
您可以通过使用点号(.)来访问对象值:
myObj = { "name":"Bill Gates", "age":62, "car":null }; x = myObj.name;
一个 JSON 对象中的值可以是另一个 JSON 对象。
myObj = { "name":"Bill Gates", "age":62, "cars": { "car1":"Porsche", "car2":"BMW", "car3":"Volvo" } }
您能够通过使用点号和括号访问嵌套的 JSON 对象:
x = myObj.cars.car2;
[ "Porsche", "BMW", "Volvo" ]
JSON 中的数组几乎与 JavaScript 中的数组相同。
在 JSON 中,数组值的类型必须属于字符串、数字、对象、数组、布尔或 null。
在 JavaScript 中,数组值可以是以上所有类型,外加任何其他有效的 JavaScript 表达式,包括函数、日期和 undefined。
数组可以是对象属性的值:
{ "name":"Bill Gates", "age":62, "cars":[ "Porsche", "BMW", "Volvo" ] }
概述
Jackson库(http://jackson.codehaus.org),是基于java语言的开源json格式解析工具,整个库(使用最新的2.2版本)包含3个jar包:
jackson-core.jar——核心包(必须),提供基于“流模式”解析的API。
jackson-databind——数据绑定包(可选),提供基于“对象绑定”和“树模型”相关API。
jackson-annotations——注解包(可选),提供注解功能。
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>2.9.3</version>
- </dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- <version>2.9.3</version>
- </dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.9.3</version>
- </dependency>
Jackson的优势
相对于java json解析的其他库,诸如json-lib、gson包,Jackson具有以下优点:
功能全面,提供多种模式的json解析方式,“对象绑定”使用方便,利用注解包能为我们开发提供很多便利。
性能较高,“流模式”的解析效率超过绝大多数类似的json包。
重要API
核心包:JsonPaser(json流读取),JsonGenerator(json流输出)。
数据绑定包:ObjectMapper(构建树模式和对象绑定模式),JsonNode(树节点)。
————————————————
在实际应用中,用的最多的是数据对象绑定的模式,即将一个对象序列化为json字符串和将一串json字符串反序列化为java对象或Map。
ObjectMapper 通过 writeValue 系列方法 将 java 对 象序列化 为 json,并 将 json 存 储成不同的格式,String(writeValueAsString),Byte Array(writeValueAsString),Writer, File,OutStream 和 DataOutput。
ObjectMapper 通过 readValue 系列方法从不同的数据源像 String , Byte Array, Reader,File,URL, InputStream 将 json 反序列化为 java 对象。
- User user = new User();
- user.setName("张三");
- ObjectMapper objectMapper = new ObjectMapper();
- String s = objectMapper.writeValueAsString(user);
- System.out.println(s);
- /*反序列化为Java格式*/
- Object o = objectMapper.readValue(s,User.class);
- System.out.println(o);
在调用 writeValue 或调用 readValue 方法之前,往往需要设置 ObjectMapper 的相关配置信息。这些配置信息应用 java 对象的所有属性上。示例如下:
- //在反序列化时忽略在 json 中存在但 Java 对象不存在的属性
- mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
- false);
- //在序列化时日期格式默认为 yyyy-MM-dd'T'HH:mm:ss.SSSZ
- mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false)
- //在序列化时忽略值为 null 的属性
- mapper.setSerializationInclusion(Include.NON_NULL);
- //忽略值为默认值的属性
- mapper.setDefaultPropertyInclusion(Include.NON_DEFAULT);
ackson 根据它的默认方式序列化和反序列化 java 对象,若根据实际需要,灵活的调整它的默认方式,可以使用 Jackson 的注解。常用的注解及用法如下。
表 1. Jackson 的 常用注解
注解 | 用法 |
---|---|
@JsonProperty | 用于属性,把属性的名称序列化时转换为另外一个名称。示例: @JsonProperty("birth_ d ate") private Date birthDate; |
@JsonFormat | 用于属性或者方法,把属性的格式序列化时转换成指定的格式。示例: @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm") public Date getBirthDate() |
@JsonPropertyOrder | 用于类, 指定属性在序列化时 json 中的顺序 , 示例: @JsonPropertyOrder({ "birth_Date", "name" }) public class Person |
@JsonCreator | 用于构造方法,和 @JsonProperty 配合使用,适用有参数的构造方法。 示例: @JsonCreator public Person(@JsonProperty("name")String name) {…} |
@JsonAnySetter | 用于属性或者方法,设置未反序列化的属性名和值作为键值存储到 map 中 @JsonAnySetter public void set(String key, Object value) { map.put(key, value); } |
@JsonAnyGetter | 用于方法 ,获取所有未序列化的属性 public Map<String, Object> any() { return map; } |
Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
Fastjson 可以操作任何 Java 对象,即使是一些预先存在的没有源码的对象。
Fastjson 源码地址:https://github.com/alibaba/fastjson
Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>fastjson</artifactId>
- <version>1.2.78</version>
- </dependency>
- private List<Person> listOfPersons = new ArrayList<Person>();
-
- @Before
- public void setUp() {
- listOfPersons.add(new Person(15, "John Doe", new Date()));
- listOfPersons.add(new Person(20, "Janette Doe", new Date()));
- }
-
- @Test
- public void whenJavaList_thanConvertToJsonCorrect() {
- String jsonOutput= JSON.toJSONString(listOfPersons);
- }
- @Test
- public void whenJson_thanConvertToObjectCorrect() {
- Person person = new Person(20, "John", "Doe", new Date());
- String jsonObject = JSON.toJSONString(person);
- Person newPerson = JSON.parseObject(jsonObject, Person.class);
-
- assertEquals(newPerson.getAge(), 0); // 如果我们设置系列化为 false
- assertEquals(newPerson.getFullName(), listOfPersons.get(0).getFullName());
- }
我们可以使用 JSON.parseObject() 将 JSON 字符串转换为 Java 对象。
注意反序列化时为对象时,必须要有默认无参的构造函数,否则会报异常:
@JSONField(name = "DATE OF BIRTH", deserialize=false) private Date dateOfBirth;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。