8.2 需求分析
本章对JSON 转换器组件的需求进行分析,确定使用场景和核心功能。
8.2.1 需求场景
使用JSON转换器的Ajax应用,交互序列如图8-3所示。
图8-3 使用JSON 转换器的Ajax应用交互序列
与图8-2相比,变化的是在服务端的业务处理过程,具体细分为三个步骤:
(1)将客户端异步提交过来的JavaScript数据,通过JSON转换器转换为Java数据;
(2)对Java数据进行业务处理;
(3)将业务处理结果的Java数据,通过JSON转换器,转换为JSON格式的JavaScript数据,回送给客户端。
第(1)步和第(3)步,是JSON转换器的主要使用场景。
8.2.2 核心功能
JSON 转换器的核心功能,只有两个:
(1)将JSON文本串转换为Java对象;
(2)将Java对象转换为JSON文本串。
在转换过程中,需要明确数据转换规则,也就是要确定:什么样的JSON文本串,可以转换为什么样的Java对象,反之亦然。
根据JSON 的语法规范,其只有两种基本格式的文本串:
(1)用{和} 括起来的名/值对;
(2)用[和]括起来的一系列值。
上述两种基本格式还可以进行任何层次的嵌套。
而Java数据,都是对象,包括语言的内置类型、日期类型、集合类型,还有用户自定义的对象。
JSON 转换器的数据转换规则,汇总如下:
JSON文本串 -> Java对象 | ||||
JSON |
示例 |
Java |
类型 |
示例 |
单值 |
"5" |
基本类型(自动转换为目标对象类型) |
String |
5 |
Integer |
5 | |||
Double |
5 | |||
'2008-12-02 14:25:06' |
Timestamp |
"2008-12-02 14:25:06" | ||
值序列 |
[1, 5, 7, 12] |
数组或集合类型(自动转换为目标对象类型) |
int[] |
|
Integer[] |
| |||
List |
| |||
ArrayList |
| |||
LinkedList |
| |||
Set |
| |||
HashSet |
| |||
名值对 |
{x:20, y:50} |
Map或自定义对象类型 |
Map |
key="x",value=20 |
自定义对象 |
public class Point { |
续表
嵌套 |
[[20,50], [200, 450]] |
根据以上规则,进行相应嵌套对应 |
int[][] |
|
{leftUpper: {x:20,y:50}, rightDown: {x:200, y:450}} |
自定义 |
public class Rect { | ||
{leftUpper: [20,50], rightDown: [200, 450]} |
自定义 |
public class Rect { |
Java对象 -> JSON文本串 | ||||
Java |
类型 |
示例 |
JSON |
示例 |
基本类型 |
String |
5 |
单值 |
"5" |
Integer |
5 |
5 | ||
Double |
5.26 |
5.26 | ||
Timestamp |
|
'2008-12-02 14:25:06' | ||
数组或集合类型 |
int[] |
|
值序列 |
[1, 5, 7, 12] |
Integer[] |
| |||
List |
| |||
ArrayList |
| |||
LinkedList |
| |||
Set |
| |||
HashSet |
|
续表
Map或自定义对象 |
Map |
key="x",value=20 |
名值对 |
{x:20, y:50} |
自定义对象 |
public class Point { | |||
组合 |
int[][] |
|
嵌套 |
[[20,50], [200, 450]] |
自定义对象 |
public class Rect { |
{leftUpper: {x:20,y:50}, rightDown: {x:200, y:450}} | ||
自定义对象 |
public class Rect { |
{leftUpper: [20,50], rightDown: [200, 450]} |