json轻量数据格式
基本上所有的类型都可以通过json来表示
json数据格式
如下:
- 数组的json表示形式
@GetMapping("arrays")
public int[] arraysToJson(){
//定义数组
int[] a={1,2,3,4,5,6,7,8,9};
return a;
}
2. list的json表示形式
@GetMapping("list")
public List list(){
//定义list
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
list.add(8);
list.add(9);
return list;
}
3. 对象的json表现形式
@GetMapping("student")
public Student student(){
Student students = new Student();
students.setAge(10);
students.setName("小明");
return students;
}
4. map的json表现形式
@GetMapping("mapp")
public Map map(){
Map map = new HashMap();
map.put("年龄","23");
map.put("姓名","张三");
return map;
}
由以上可以看出,单列(数组和list)数据的json形式都是用中括号括起来的,双列的键值对(对象,map)都是用花括号括起来的,键有引号引起来,键和值之间用冒号隔开,每一对键值对用逗号隔开;
- 接下来是一个花括号和中括号的混合,可以更好的理解json
@GetMapping("map111")
public Map map11() {
Map<String, Object> map = new HashMap<>();
map.put("学生1", new Student("学生1姓名", 23));
map.put("学生2", new Student("学生2姓名", 45));
List<Object> list = new ArrayList<>();
list.add("list第1个元素");
list.add("list第2个元素");
list.add("list第3个元素");
list.add("list第4个元素");
int arr[] = {1, 2, 3, 4, 5};
list.add(arr);
Map<String, String> map1 = new HashMap<>();
map1.put("第二个集合1", "第二个集合的第一个元素");
map1.put("第二个集合2", "第二个集合的第二个元素");
list.add(map1);
map.put("list", list);
return map;
}
首先定义一个map,往map里面添加两个学生对象,再创建一个list,list里面添加几个元素,再创建一个数组,将数组放入到list中去,再创建一个map1,将map1放入到list中去,然后将list放入map;
{
"学生2": {
"name": "学生2姓名",
"age": 45
},
"list": [
"list第1个元素",
"list第2个元素",
"list第3个元素",
"list第4个元素",
[
1,
2,
3,
4,
5
],
{
"第二个集合2": "第二个集合的第二个元素",
"第二个集合1": "第二个集合的第一个元素"
}
],
"学生1": {
"name": "学生1姓名",
"age": 23
}
}
- 最外层的花括号是map的,放在map里面的全都是键值对;
- map里的第一个键值对是学生2和学生2对象;学生2对象也是以键值对的形式存在,所以它也是花括号;
- map里的第二个键值对是list和list对象;list对象是单列的,所以中括号;list里面的前四个元素是一般元素;第五个元素是数组,因为数组也是单列,所以数组也是中括号;第六个元素是map2,map2是键值对,所以是花括号;
- map里的第三个键值对是学生1和学生1对象;学生1对象也是以键值对的形式存在,所以它也是花括号;
以上就是json的数据格式;
json和其它格式相互转换
- 首先是json和键值对类型(也就是花括号之间的转换)
- Java对象和json的幻想转换
public static void main(String[] args) {
//json和对象的相互转换
//先创建一个java对象并赋值
Student student = new Student();
student.setName("北京");
student.setAge(12);
System.out.println("未转换json之前的student#######"+student);//未转换json之前的student#######Student(name=北京, age=12)
//将java对象转换为json字符串
String s = JSON.toJSONString(student);
System.out.println("student的json字符串###########"+s);//student的json字符串###########{"age":12,"name":"北京"}
//将json字符串转为json对象
JSONObject jsonObject = JSON.parseObject(s);
System.out.println("student的json对象###########"+jsonObject);//student的json对象###########{"name":"北京","age":12}
//将json字符串转为Java对象
Student student1 = JSON.parseObject(s, Student.class);
System.out.println("转换json之后的student#######"+student1);//转换json之后的student#######Student(name=北京, age=12)
}
- java对象可以通过JSON.toJSONString()方法转换为json字符串;
- json字符串可以通过JSON.parseObject()方法转换为json对象;
- json字符串可以通过JSON.parseObject()方法转换为Java对象;
- json和单列集合的转换(也就是中括号)
- list和json的相互转换
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
//list转为json字符串
String s3 = JSON.toJSONString(list);
//json字符串转为json对象
JSONArray objects = JSON.parseArray(s3);
//json字符串转为list
List lists = JSON.parseObject(s3,List.class);
System.out.println(lists);
}
- list可以通过JSON.toJSONString()方法转换为json字符串;
- json字符串可以通过JSON.parseArray()方法转换为json对象;
- json字符串可以通过JSON.parseObject()方法转换为list对象;
由上面json和键值对以及list的相互转换可以得出:
- 当json字符串为花括号时,转换为json对象需要用JSON.parseObject()方法;
- 当json字符串为中括号时,转换为json对象需要用JSON.parseArray()方法;
然后可以对复杂一点的json进行解析;
[
{
"districtid": 110000,
"name": "北京市",
"pid": 0,
"level": 1,
"son": [
{
"districtid": 110100,
"name": "市辖区",
"pid": 110000,
"level": 2,
"son": [
{
"districtid": 110101,
"name": "东城区",
"pid": 110100,
"level": 3,
},
{
"districtid": 110119,
"name": "延庆区",
"pid": 110100,
"level": 3,
}
]
}
],
"abridge_name": "北京"
},
{
"districtid": 120000,
"name": "天津市",
"pid": 0,
"level": 1,
"son": [
{
"districtid": 120100,
"name": "市辖区",
"pid": 120000,
"level": 2,
"son": [
{
"districtid": 120113,
"name": "北辰区",
"pid": 120100,
"level": 3,
"son": []
},
{
"districtid": 120114,
"name": "武清区",
"pid": 120100,
"level": 3,
"son": []
}
]
}
],
"abridge_name": "天津"
}
]
开始分析这个json;
- 当拿到这个json字符串之后,发现它的最外层是中括号,所以我们需要用JSON.parseArray()将它转为一个json对象;
- 最外层的中括号里面是两个花括号,可以遍历循环拿到每一个花括号,然后通过JSON.parseObject()将每一个花括号转换为json对象;
- 以此类推,碰到中括号用JSON.parseArray(),碰到花括号用JSON.parseObject();
代码如下:
public void import1() {
//读取文件
InputStream inputStream = this.getClass().getResourceAsStream("/static/city.json");
String string = "";
StringBuilder sb = new StringBuilder();
if (inputStream == null) {
throw new RuntimeException("读取json文件失败");
} else {
try {
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
while ((line = br.readLine()) != null) {
sb.append(line);
System.out.println(string);
}
} catch (Exception e) {
e.printStackTrace();
}
//json从这里开始
string = sb.toString();
//将拿到的json字符串转为json对象,因为json最外层是中括号,所以用JSON.parseArray();
JSONArray jsonArray = JSON.parseArray(string);
//JSONArray objects = JSONArray.parseArray(string);//这种方式也可以解析中括号
for (int i = 0; i < jsonArray.size(); i++) {
//因为最外层的中括号里面是花括号,现在拿到了每一个花括号,所以用getJSONObject解析;
//意思就是下一步返回的是中括号就用getJSONArray(),若是花括号就用getJSONObject();
JSONObject jsonObject = jsonArray.getJSONObject(i);
//得到花括号里键为son的中括号
JSONArray son = jsonObject.getJSONArray("son");
for (int s = 0; s < son.size(); s++) {
JSONObject jsonObject1 = son.getJSONObject(s);
for (int a = 0; a < jsonObject1.size(); a++) {
JSONArray son1 = jsonObject1.getJSONArray("son");
for (int q = 0; q < son1.size(); q++) {
JSONObject jsonObject2 = son1.getJSONObject(q);
//最终用get获取
Object name = jsonObject2.get("name");
JSONArray array = jsonObject2.getJSONArray("array");
for (int x = 0; x < array.size(); x++) {
Object o = array.get(x);
//最终用get获取
System.out.println(o);
}
System.out.println(name);
}
}
}
}
}
}