十分钟搞懂JSON(JSON对象---JSON字符串---对象 之间的区别)

好记性不如烂笔头,相信我,看了之后你会彻底搞懂JSON

前言:前天被JSON对象,JSON字符串,JAVA对象搞混了,不知道各自代表的意思,我就查了资料,总结为一篇博文。

另外我想List<User>要序列化,那么List<String>为什么不能序列化?后来我想明白了,List<String>为什么要序列化呢?我们传输信息在JAVA中都是对象传输,你单纯的传一堆String过去又有什么意义,如果你想传输一堆String,你也是通过对象来传输。所以总结来就是 List<String>序列化毫无意义。

目录

1.  JSON百度百科介绍

2.  概念: JavaScript Object Notation -JavaScript对象表示法

3.  语法:

    3.1  基本规则   

    3.2  获取数据:

4. JSON对象以及JSON字符串以及Java对象的区别

5. 序列化以及前端序列化和后端序列化的方法(JSON)

5.1 序列化的概念

5.2 前端的序列化和反序列化

5.3  后端的序列化和反序列化

5.3.1  后端序列化和反序列化的方法一(推荐使用,好用)

5.3.2  后端序列化和反序列化的方法二(以前的学习笔记 逻辑比较清楚,贴出来大家一起看一看)


 

1.  JSON百度百科介绍

https://baike.baidu.com/item/JSON/2462549?fr=aladdin

2.  概念: JavaScript Object Notation -JavaScript对象表示法

一句话来描述JSON,JSON现在多用于存储和交换文本信息的语法,进行数据的传输,JSON比 XML 更小、更快,更易解析。

3.  语法:

    3.1  基本规则   

 var ps = [{"name": "张三", "age": 23, "gender": true},

                    {"name": "李四", "age": 24, "gender": true},

                    {"name": "王五", "age": 25, "gender": false}];

        * 数据在名称/值对中:json数据是由键值对构成的

            * 键用引号(单双都行)引起来,也可以不使用引号

            * 值得取值类型:

                1. 数字(整数或浮点数)

                2. 字符串(在双引号中)

                3. 逻辑值(true 或 false)

                4. 数组(在方括号中)    {"persons":[{},{}]}

                5. 对象(在花括号中) {"address":{"province":"陕西"....}}

                6. null

        * 数据由逗号分隔:多个键值对由逗号分隔

        * 花括号保存对象:使用{}定义json 格式

        * 方括号保存数组:[]

    3.2  获取数据:

        1. json对象.键名

        2. json对象["键名"]

        3. 数组对象[索引]

        4. 遍历                

//1.定义基本格式
var person = {"name": "张三", age: 23, 'gender': true};
var ps = [{"name": "张三", "age": 23, "gender": true},
          {"name": "李四", "age": 24, "gender": true},
          {"name": "王五", "age": 25, "gender": false}];

//获取person对象中所有的键和值
    //for in 循环
    /* for(var key in person){
                    //这样的方式获取不行。因为相当于  person."name"
                    //alert(key + ":" + person.key);
                    alert(key+":"+person[key]);
                }*/

//获取ps中的所有值
for (var i = 0; i < ps.length; i++) {
     var p = ps[i];
    for (var key in p) {
        alert(key + ":" + p[key]);
    }
}

4. JSON对象以及JSON字符串以及Java对象的区别

json对象和json字符串的区别 https://www.cnblogs.com/agansj/p/9053547.html(备注:这个博客比较好,可以简单看一下,支持原创)

目前看法: json是传输数据的一种格式,在前端有 json对象和json字符串之分,在后端只有 对象和 json字符串的叫法,为什么能有json对象这个叫法?无非是 对象 用json的数据格式表达出来。

 

有人会问为什么后端没有json对象这个叫法呢?因为你在后端接触最多的是Java对象,你想用JSON的格式将数据传输,就要进行序列化操作。序列化的概念:序列化是将对象转化为字节序列的过程。对象序列化后可以在网络上传输,或者保存到硬盘上。序列化后,你的对象就会转化为 具有JSON格式的字符串。所以你描述后端 还是不要出现json对象这个叫法。

一般在后端通过@reponseBody注解将返回的java对象转化为json格式的对象,传输到前台

5. 序列化以及前端序列化和后端序列化的方法(JSON)

5.1 序列化的概念

序列化是将对象转化为字节序列的过程。对象序列化后可以在网络上传输,或者保存到硬盘上。

5.2 前端的序列化和反序列化

将对象序列化成json字符串:    JSON.stringify(json对象);

反序列化:将json字符串反序列化为对象:   JSON.parse(str)

5.3  后端的序列化和反序列化

在后端的 序列化是 java对象->json字符串。反序列化是 json字符串->java对象

5.3.1  后端序列化和反序列化的方法一(推荐使用,好用)

这个ObjectMapper对象是jackson包下面的,这是他的依赖

       <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.3</version>
        </dependency>



//类属性,

private static final ObjectMapper MAPPER = new ObjectMapper();

//序列化-----userMapList是List<user>的格式,现在我们需要将List集合序列化为json字符串

MAPPER.writeValueAsString(userMapList);

//反序列化---json格式的字符串要反序列化为对象

MAPPER.readValue(你要反序列化的json字符串,new TypeReference<要反序列化为什么对象类型,例如 User.class>() {});

5.3.2  后端序列化和反序列化的方法二(以前的学习笔记 逻辑比较清楚,贴出来大家一起看一看)

* JSON解析器:
                * 常见的解析器:Jsonlib,Gson,fastjson,jackson
            1. JSON转为Java对象
                1. 导入jackson的相关jar包
                2. 创建Jackson核心对象 ObjectMapper
                3. 调用ObjectMapper的相关方法进行转换
                    1. readValue(json字符串数据,Class)
            2. Java对象转换JSON
                1. 使用步骤:
                    1. 导入jackson的相关jar包
                    2. 创建Jackson核心对象 ObjectMapper
                    3. 调用ObjectMapper的相关方法进行转换
                        1. 转换方法:
                            * writeValue(参数1,obj):
                                参数1:
                                    File:将obj对象转换为JSON字符串,并保存到指定的文件中
                                    Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
                                    OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
                            * writeValueAsString(obj):将对象转为json字符串

              2. 注解:
                            1. @JsonIgnore:排除属性。
                            2. @JsonFormat:属性值得格式化
                            * @JsonFormat(pattern = "yyyy-MM-dd")
             3. 复杂java对象转换
                            1. List:数组
                            2. Map:对象格式一致

下面的代码 你跟着敲一遍,就会使用了



import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;

import java.io.FileWriter;
import java.util.*;


public class JacksonTest {

    //Java对象转为JSON字符串
    @Test
    public void test1() throws Exception {
        //1.创建Person对象
        Person p = new Person();
        p.setName("张三");
        p.setAge(23);
        p.setGender("男");

        //2.创建Jackson的核心对象  ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        //3.转换
        /*
            转换方法:
                writeValue(参数1,obj):
                    参数1:
                        File:将obj对象转换为JSON字符串,并保存到指定的文件中
                        Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
                        OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
                writeValueAsString(obj):将对象转为json字符串
         */
        String json = mapper.writeValueAsString(p);
        //{"name":"张三","age":23,"gender":"男"}
        //System.out.println(json);//{"name":"张三","age":23,"gender":"男"}

        //writeValue,将数据写到d://a.txt文件中
        //mapper.writeValue(new File("d://a.txt"),p);

        //writeValue.将数据关联到Writer中
        mapper.writeValue(new FileWriter("d://b.txt"), p);
    }

    @Test
    public void test2() throws Exception {
        //1.创建Person对象
        Person p = new Person();
        p.setName("张三");
        p.setAge(23);
        p.setGender("男");
        p.setBirthday(new Date());

        //2.转换
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(p);
        System.out.println(json);//{"name":"张三","age":23,"gender":"男","birthday":1530958029263}
        //{"name":"张三","age":23,"gender":"男","birthday":"2018-07-07"}
    }

    @Test
    public void test3() throws Exception {
        //1.创建Person对象
        Person p = new Person();
        p.setName("张三");
        p.setAge(23);
        p.setGender("男");
        p.setBirthday(new Date());


        Person p1 = new Person();
        p1.setName("张三");
        p1.setAge(23);
        p1.setGender("男");
        p1.setBirthday(new Date());

        Person p2 = new Person();
        p2.setName("张三");
        p2.setAge(23);
        p2.setGender("男");
        p2.setBirthday(new Date());

        //创建List集合
        List<Person> ps = new ArrayList<Person>();
        ps.add(p);
        ps.add(p1);
        ps.add(p2);

        //2.转换
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(ps);
        // [{},{},{}]
        //[{"name":"张三","age":23,"gender":"男","birthday":"2018-07-07"},{"name":"张三","age":23,"gender":"男",
        // "birthday":"2018-07-07"},{"name":"张三","age":23,"gender":"男","birthday":"2018-07-07"}]
        System.out.println(json);
    }

    @Test
    public void test4() throws Exception {
        //1.创建map对象
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "张三");
        map.put("age", 23);
        map.put("gender", "男");

        //2.转换
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(map);
        //{"name":"张三","age":23,"gender":"男"}
        System.out.println(json);//{"gender":"男","name":"张三","age":23}
    }


    //演示 JSON字符串转为Java对象
    @Test
    public void test5() throws Exception {
        //1.初始化JSON字符串
        String json = "{\"gender\":\"男\",\"name\":\"张三\",\"age\":23}";

        //2.创建ObjectMapper对象
        ObjectMapper mapper = new ObjectMapper();
        //3.转换为Java对象 Person对象
        Person person = mapper.readValue(json, Person.class);
        System.out.println(person);
    }
}

 

 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值