javascript 对象转json-json从成佛到成佛

2023-09-02 0 2,548 百度已收录

本文原作者为bigsai(同公众号),头条号账号:码农bigsai。 本文以通俗易懂的方式向您解释您所知道的json。 如有错误或不准确之处,敬请谅解!

如果本文对您有帮助,感谢您阅读后的转发和点赞! 您的支持是我们不断创作的动力!

诞生于JavaScript,json的前世今生的含义

在开始之前,先问一个问题,什么是json?

json 不是原始短语。 它实际上是4个字JavaScript Object Notation(JavaScript对象表示法)的缩写。 它是一种轻量级的文本数据交换格式,并且json独立于语言(使用JavaScript句型来描述对象)。 很多编程语言都支持json。 JSON 已成为当前服务器和 Web 应用程序之间数据传输的公认标准。

json的诞生

问个问题,json是怎么诞生的?

这个问题首先是由于互联网应用程序之间需要传输数据而造成的,而很多跨平台的程序需要交互,并且只能以纯文本的形式进行交互。 XML 曾经是一种选择,但 XML 标准变得越来越复杂。 解析效率也比较低。 很多攻城狮看到xml就一头雾水,搞了半天也不一定能看懂。

随后专门研究 JavaScript 的 JavaScript 大师(被评价为 JavaScript 之父)Douglas Crockford 根据 JavaScript 的规范发明并推广了 json。 json格式简单易用,还可以跨平台传输,得到了广泛的认可和传播。 就这样,json越来越流行,现在已经成为主流技术之一。

(选择题)章节练习:json(B)是个什么样的东西?

找出json兄弟姐妹,看看json VS xml的区别

当谈到 json 时,肯定要与 xml 进行比较。 没有比较就没有伤害。 在与json担负同样职责的文本传输交换格式中,还有json的老大哥xml(可扩展标记语言),它是在json之后诞生的。 以前我们都是使用xml来进行文件数据传输。

首先我们需要从定义上看一下json和xml的区别:

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,具有高度可读性并且易于快速编译。 不同平台之间的数据交换是可能的。 它的语言约定有类似C的约定系统(c、c++、java等)。 XML(可扩展标记语言)是一种标记语言,用于标记电子文档以使它们结构化。 它可用于标记数据和定义数据类型。 它是一种源语言,允许用户定义自己的标记语言。 。

json的出现充分吸收了xml的优点,所以json和xml有一些相同的优点:

但虽然json比蓝更胜一筹,但它肯定有一些xml所不具备的特性和优点,比如:

尽管如此,xml仍然有其独特的应用领域:

当然,并不是所有的json都是“豪华”的,适合场景需要的才是最好的。 但在web领域的数据传输中,它就是王者!

(选择题)小练习:下列选项中错误的是? (二)

小小翻译家,json的应用

json之所以很受欢迎,是因为json的应用范围很广。 主要包括与ajax结合使用的统一平台的后端传输; 跨平台数据传输; 非关系型数据库中的文档存储等,这些字段通过json的使用,极大的提升了应用效率。

前端ajax+json异步传输:

json本身起源于JavaScript,而JavaScript在解析和处理json方面具有天然的优势。 在Ajax异步加载的数据中,整个页面已经加载完毕,我们只需要在对应的位置渲染真实的数据即可。 我们使用json文本来存储这部分真实数据,并使用JavaScript异步请求服务器。 请求成功后,JavaScript会渲染并填充它。 下图是前端交互和ajax异步交互的传统方法的简单说明:

如果您不熟悉 AJAX? 看不懂流程,也看不懂异步传输的本质。 我们用下图中的反例来解释一下。 对于一个非常大的网页来说,它可以由各种模块组成。 其中评论模块对于我们来说是很小的一个。 模块,但是注释可能涉及很多注释,并且可能涉及分页。 如果我们每次点击下一页来阅读下一页的评论,都会请求服务器刷新整个页面资源,这样会浪费服务器资源和带宽。 (如果注释的文本发生了变化,其他模块是否应该重新渲染?)

所以我们使用所谓的AJAX异步更新工具,就是通过JavaScript请求下一页的评论相关数据(使用json作为数据交互文本)。 JavaScript 拿到这串 json 字符串,里面包含了页面所需要的评论信息,然后我们通过万能的 JavaScript 将这部分渲染到评论模块对应的位置。

经过这个过程,我们不仅节省了带宽,提高了响应速度,而且还提高了服务器的相对负载能力(每个请求需要更少的资源),提高了用户体验,同时也提高了------(万此处省略字符)

跨平台网络服务:

前面提到的是前端和前端的交互,前提是前端也是给后端提供服务的编程语言和平台。 然而,随着互联网的发展,很多时候你会遇到服务拆分、跨平台等服务需求。 跨语言、跨平台的最大障碍是服务的沟通。 您不会在您的笔记本电脑上使用 C++ 代码直接调用我的笔记本电脑上的 Java 函数,对吗? 为了解决这些问题,此时通过restful风格的socket以及json作为文本传输格式就可以很好的解决服务通信问题。

比如一个公司业务太大,服务分配给A组和B组,很多时候A可能需要调用B服务。 如果A队都是java,B队都是php,他们互相喊着自己是世界上最好的,不肯屈服,怎么办? 那么通过json进行通信是一种非常好的形式。 流程简述如图:

非关系型数据库存储(Nosql)

随着互联网web2.0网站的普及,传统的关系数据库在处理超大规模的网站和高并发时已经显得有些力不从心了。 非关系型数据库由于其自身的特点,发展得特别迅速。 非关系型数据库在大规模数据下也有特别好的读写性能,而且数据之间没有关系,无形中带来了架构层面的结构性变化。 可扩展的能力。

有很多基于文档存储的非关系型数据库都使用json作为存储格式。 其中比较知名的有:MongoDB、CouchDB、RavenDB等。存储的内容是文档类型,因此也有机会在各个数组上建立索引,实现关系数据库的各个功能。

有的朋友可能会问:既然json可以做到,那么xml也可以实现类似的功能吗?

答案是否定的,因为查询和修改xml类型数组的效率很一般。 主要原因是DB层很难为xml数组构建高效的索引,而应用层需要从字符流解析转换为DOM。 。 NoSQL以json的形式存储,提供原生态支持,效率远不如传统关系型数据库。

此外,Elasticsearch等搜索引擎也使用json和java api来提供其所有特性和功能。 JSON 越来越多地用于开源中间件!

(多选)小练习:JSON常用在以下领域? (ABC)

拒绝四种差异,json句型需要json语法规则

json句型是JavaScript句型的子集,json通常用于传输对象和字段。 即,json句型是JavaScript句型(满足特定句型的JavaScript句型)的一部分。

json 名称/值

json数据的书写格式为:“name”:“value”。 JavaScript对应的概念是:name="value",但是json的格式和JavaScript对象的格式还是不一样的:

json对象

JSON有两种表示结构——对象和字段,通过它们可以表示更复杂的结构。 比较java,json字段和json对象就像java列表/数组(对象类型)和对象(Map)。 而且在很多情况下,对象值可能会相互嵌套多层。 对象中有对象,对象中有字段,数组中有对象……下图可以在一定程度上体现json对象和字段的关系:

json对象很容易理解。 它代表一个实体。 该实体还有一些其他属性。 这些属性可以是数字、字符串(需要双引号)、逻辑值、对象(增加的大括号)、数组(方括号)、 null 。 从java语言的角度来看,它对应于一个实体类或者一个Map,其中有一些以通配符的形式描述名称和值。

var a = {"name":"bigsai" , "sex":"man","school":{"name":"博学谷","localtion":"Bei Jing"}};

Value:可以使用(.)或([])来获取值,如a.name(a.sex)和a["name"](a["sex"]),代码解释如下:

对象集对象:可以使用(.)或([])来获取值。 代码解释如下:

遍历:可以使用for-in来遍历对象。 代码解释如下:

修改:可以使用(.)或([])来更改对象的值。 示例代码如下:

删除:可以通过delete关键字删除json对象的属性值。 示例代码如下:

完整代码截图为:

附代码:

var a = {"name":"bigsai" , "sex":"man","school":{"name":"博学谷","localtion":"Bei Jing"}};
a.name+" "+a["name"]
a.school
a["school"].name
for (key in a){//遍历对象
    console.log(key+" "+a[key]);}
a.name="saisai"
a["sex"]="woman"
a
delete a["school"]
a

json链表

学完了json对象,再学json链表就会容易很多。 json链表和json对象之间有一些区别。 json链表用方括号([])表示,每个值用冒号(,)分隔,链表值需要是合法的json数据类型(字符串、数字、对象、数组、布尔值)或为空)。

var names=["bigsai","bigpian","bigbig"];//json数组
var students=[{"name":"bigsai","high":180},{"name":"bigpian","high":165},{"name":"Yao Ming","high":226}];//对象套数组

值:可以使用方括号([])来选择值,如names[0]或names["0"],示例代码如下:

数组集合对象:获取到对象的值后,就遵循对象的句型。 示例代码如下:

遍历:可以使用for-in或for来遍历json链表。 示例代码如下:

修改:可以使用([])索引号来改变链表。 示例代码如下:

删除:可以通过delete关键字删除json链表中的项。 示例代码如下:

完整的json链表示例代码如下:

附源码:

var names=["bigsai","bigpian","bigbig"];//json数组
var students=[{"name":"bigsai","high":180},{"name":"bigpian","high":165},{"name":"Yao Ming","high":226}];//对象套数组
names["0"]+" "+names[0]//json数组取值
students[2]["name"]+" 身高:"+students[2].high//json数组套对象(对象套数组同理)
for (i in names){  console.log(names[i]);  }//for in 遍历
for (i=0;i<names.length;i++){console.log(names[i]);}
names[0]="bigsai666";
delete names[0];
names

JavaScript 对象 vs json 对象 vs json 字符串

JavaScript中提到json,很多人都会对JavaScript对象、json对象、json字符串感到困惑和不清楚。 我们可以看一个反例:

var a1={ name:"bigsai" , sex:"man" };//JavaScript对象
var a2={'name':'bigsai' , 'sex':'man'};//JavaScript对象
var a3={"name":"bigsai" , "sex":"man"};//满足json格式的JavaScript对象
var a4='{"name":"bigsai" , "sex":"man"}';//json字符串

一般来说:

这里多说几句,大家可能对json对象还是有点不清楚。 你也可能在其他地方遇到json对象。 首先,json是一种数据格式,json有两种具体的表达格式:对象和字段。

总的来说,我们一般所说的json对象、json链表本质上都是一种数据格式。 但我们会将不同语言中满足这些格式要求的对象和数组称为JSON对象和JSON链表。

(选择题)小练习:下面哪个是满足json格式的JavaScript对象? (四)

概括

本章小结:可以发现json的语法规则比较简单。 对于json句子格式,要记住json的数据名只能是带双引号("")的字符串,并且要记住json对象的值。 什么类型的满足。 对于json对象和json链表来说,它们是json的两种表示结构,而json的灵活性也使得这两种类型可以相互嵌套,可以表示更复杂的结构。

(单选题)既然你我已经学会了json对象、数组以及一些基本句型,那么我们来测试一下你,json对象的值不可以是以下哪种类型? (四)

Google Gson,精简而强大的序列化/反序列化介绍

前面我们学习了json的一些概念和基本句型,也知道json在于JavaScript,它在python等很多语言中都得到很好的支持,但是也有很多语言不支持json从语言本身来看(就比如我们强大的java)。 这其实是一个很大的障碍但是并不妨碍我们在java语言中使用json。 我们可以通过添加一些工具包来强制java支持json处理。

这些工具包可以将json字符串转换为java对象以在Java中使用。 反过来,java 对象可以转换为 json 字符串,以便在其他地方更广泛地使用。 将Java对象转换为Json字符串的过程称为Serialization,将Json字符串转换为Java对象的过程称为Deserialization反序列化。

如果很容易混淆,可以用下图来组合内存: 从java的角度来看,java对象需要从一个整体对象拆分成碎片,依次写入json字符串。 这是一个序列化的过程。 json字符串的碎片依次被重新组装成一个完整的java对象。 这个过程就是反序列化。

json本身并不复杂,但是如果程序员直接在java中操作json字符串,那就非常麻烦和复杂了。 许多优秀的程序员/团队/公司努力学习和运用他们的经验,合智开源供您使用。 其中Gson/fastjson/Jackson比较流行。 我们来一一了解一下。

Gson简介

在学习之前,你知道Gson是什么吗? Gson 是 Microsoft 的一个开源 Java 库,可用于将 Java 对象转换(序列化)为其 JSON 表示形式。 它还可用于将 JSON 字符串转换(反序列化)为等效的 Java 对象。 Gson 可以处理任意 Java 对象,包括没有源代码的现有对象。 下图是Gson在github主页上的一些信息。

每个 json 工具包都有自己的优点和长处。 对于Gson来说,它有以下特点:

Gson实战

下面就从你开始练习Gson吧。 Gson的功能比较强大。 在这里,我们将与您一起实现一些基本且常用的用途。

首先创建一个java项目(Maven),引入Gson的Maven依赖或者jar包。 Maven 依赖项是:


  com.google.code.gson
  gson
  2.8.6

有了Gson的依赖,Java对象转Json就变得非常简单。 大致分为两步:

将javaBean转换为json字符串:首先创建一个student对象

public class student {
    private String name;
    private int age;
    private String sex;
    public student(String name, int age, String sex) {//构造方法
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    @Override
    public String toString() {//重写toString方法
        return "student{" +
                "name='" + name + ''' +
                ", age=" + age +
                ", sex='" + sex + ''' +
                '}';
    }
    public String getName() {//获取name字符串
        return name;
    }
    public void setName(String name) {//设置对象name
        this.name = name;
    }
    public int getAge() {//获取年龄int
        return age;
    }
    public void setAge(int age) {//设置年龄值
        this.age = age;
    }
    public String getSex() {//获取性别
        return sex;
    }
    public void setSex(String sex) {//设置性别
        this.sex = sex;
    }
}

其次,在测试中转换JavaBean(student)和json字符串。 序列化和反序列化操作主要通过toJson()和fromJson()进行。 toJson字面意思是“到达json”,所以它将java对象转换成json字符串,这就是序列化。 fromJson,直译就是“from json”,所以它将json字符串转换成java对象,也就是反序列化。

//Gson gson= new GsonBuilder().create();//可以自定义一些配置
 Gson gson=new Gson();//创建json对象
//java对象 to  json
 student stu=new student("Ben",22,"man");
 String stustr=gson.toJson(stu,student.class);//json转为string
 System.out.println("student对象为"+stu.toString());
 System.out.println("转化为json字符串:"+stustr);
 //json to java对象
 ///满足条件的json字符串{"name":"tony","age":32,"sex":"woman"}
 String jsonstr="{"name":"tony"," +
                 ""age":32," +
                 ""sex":"woman"}";
 student jsonstrobject=gson.fromJson(jsonstr,student.class);//转换为student对象
 System.out.println("json字符串为"+jsonstr);
 System.out.println("转化为student对象为:"+jsonstrobject.toString());

执行结果为:

将 java 集合和 json 字符串相互转换:

在实际开发中,我们很可能遇到的不是javaBean和json字符串的直接转换,而是集合的转换,而java集合的类型有很多种。 这里,我们实现了Map、List、String字段的序列化和反序列化操作。

在进行序列化操作时,我们首先创建Map、List、String[]对象并填充一定的数据,以方便序列化和反序列化操作。

 Gson gson=new Gson();//创建json对象
//Map
 Mapmap=new HashMap();//Map
 map.put("博学谷","666");map.put("小老弟","要加油");
 //List
 Listlist=new ArrayList();//List类型
 list.add("hello");list.add("world");list.add(map);
 //String[]
 String []str={"Hello","World"};//String
 String mapTojsonStr=gson.toJson(map);//{"小老弟":"要加油","博学谷":"666"}
 String listTojsonStr=gson.toJson(list);//["hello","world",{"小老弟":"要加油","博学谷":"666"}]
 String strTojsonStr=gson.toJson(str);//["Hello","World"]
 System.out.println("Map转为json:"+mapTojsonStr);
 System.out.println("List转为json:"+listTojsonStr);
 System.out.println("String[]转为json:"+strTojsonStr);

执行结果为:

我们将此字符串复制到新的代码字段以进行反序列化。 反序列化时,我们将使用 fromJson() 函数。 常用的构造方法有两种 fromJson(String json, Class classOfT) 和 fromJson(String json, Type typeOfT),如果遇到类库等类型,需要使用 TypeToken 来获取对象类型。

 Gson gson=new Gson();//创建json对象
 String mapTojsonStr="{"小老弟":"要加油","博学谷":"666"}";//{"小老弟":"要加油","博学谷":"666"}
 String listTojsonStr="["hello","world",{"小老弟":"要加油","博学谷":"666"}]";//["hello","world",{"小老弟":"要加油","博学谷":"666"}]
 String strTojsonStr="["Hello","World"]";//["Hello","World"]
 //方式一方便简洁(这里避免冲突注释掉)
 //Mapmap1=gson.fromJson(mapTojsonStr,Map.class);
 //方式二可以获取泛型等数据类型
 Mapmap1=gson.fromJson(mapTojsonStr,new TypeToken<Map>(){}.getType());
 Listlist=gson.fromJson(listTojsonStr,List.class);
 Mapmap2=(Map)list.get(2);
 String str[]=gson.fromJson(strTojsonStr,String[].class);
 System.out.println("json转Map:"+map1.toString());
 System.out.println("json转List"+list.toString());
 System.out.println("map1和map2是否相等:"+map2.equals(map2));//相等 
 System.out.println("String[]:"+ Arrays.toString(str));

输出是:

上面只介绍了java对象和json字符串之间的转换。 其实Gson除了简单易用之外,还有其他特别强大的功能。 在使用Gson的开发中,不仅仅是java对象和json字符串之间的转换,我们经常会直接转换 JsonObject 来进行操作(类似于JavaScript中操作json字符串),这里需要了解和学习 JsonElement、JsonObject 等数据类型、Gson封装的JsonArray、JsonPrimitive、JsonNull。

不同的数据类型有自己的使用场景。 下面我来介绍一下各个数据类型之间的区别和联系:

对于这种数据类型,您可能会问:当 json 字符串已经可以与 java 对象相互传输时,为什么还需要这种数据类型? 答案是,这种数据类型让java多了一种可以处理json格式数据的形式。 一方面让java处理json格式的数据更加灵活。 另一方面,在某些场景下,直接操作JsonObject、JsonArray等可以简化工作流程。

其实这个数据类型就相当于利用java的数据结构来构造一个json数据结构和技巧(java本身并不直接支持json),这样我们就可以直接使用和操作json了。

从上图可以看出,上面的数据结构也是按照java的一些数据结构来存储的,然后写了一些操作函数来封装一些技巧。 当然,JsonObject也可以通过Gson的toJson()和fromJson()方法灵活转换为字符串和java对象。

很多时候我们后台处理收到的是一个json字符串,它的内部结构可能非常复杂。 如果我们将其转换为java对象,我们可能需要编译java对应的实体,但是如果我们直接操作json对象,则可能会省去一些操作和流程,如果只需要添加,删除或修改一小部分,那么这些选项也是一个不错的解决方案。 当然,具体的使用方法和方案还需要根据具体业务来确定!

(多选)现在你已经学会了Gson,我们来测试一下你是否真正掌握了Gson的关键功能。 仔细想想,这个问题有点狠,而且都是错的:(AD)

飞人fastjson,阿里巴巴的“黑科技”fastjson介绍

除了微软的Gson之外,国外我们还有一个极其强大的java序列化工具包——fastjson。 下图是fastjson在github上的主页:

在学习fastjson之前,我也问过:fastjson是什么?

fastjson除了在国外被阿里开源之外,还拥有出色的性能。 fastjson的优点如下:

fastjson 的实际应用

下面带你练习一下fastjson。 我们还需要先引入依赖,下载jar包并引入或者maven依赖。


    com.alibaba
    fastjson
    1.2.70

其实fastjson和Gson大致相似但又有所不同。 Fastjson还有自己实现的JSONObject和JSONArray类。 这个功能是之前Gson中引入的。 我们在转换的时候添加JSONObject进行转换。 fastjson主要提供以下三个类: (1)JSON:fastJson解析器,用于JSON格式字符串、JSON对象和javaBean之间的转换。 (2) JSONObject:fastJson提供的json对象。 (3) JSONArray:fastJson提供json字段对象。

json字符串、JSONObject和JavaBean之间的转换首先我们还定义一个student类(和Gson的student类一样)

public class student {
    private String name;
    private int age;
    private String sex;
    public student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    //get set方法
}

在测试代​​码中javascript 对象转json,我们编写了一些代码来实现两者之间的相互转换,但是JSONObject、JSONArrray、JSON和fastjson一直都有很多方法和功能,因此这里很难详细展示它们:

 //对象转json字符串,JSONObject
student student1=new student("xiaoming",5,"man");
String jsonstr1= JSON.toJSONString(student1);//对象转json字符串
JSONObject jsonObject1=(JSONObject) JSON.toJSON(student1);//对象转JSONObject
System.out.println(jsonObject1.toString());
System.out.println(jsonstr1+"n");
//json字符串转java对象,JSONObject
String jsonstr2="{"age":5,"name":"xiaoming","sex":"man"}";
JSONObject jsonObject2=JSON.parseObject(jsonstr2);//json字符串转JSONObject对象
student student2 = JSON.parseObject(jsonstr2,student.class);//json字符串转java对象
System.out.println(jsonObject2.toString());
System.out.println(student2.toString()+"n");
//JSONObject 转java对象,json字符串
JSONObject jsonObject3=jsonObject2;
jsonObject3.put("age",18);//修改年龄
student student3=jsonObject3.toJavaObject(student.class);//JSONObject转java对象
String jsonstr3=jsonObject3.toJSONString();//JSONObject转json字符串
String name=jsonObject3.getString("name");//JSONObject取值
int age=jsonObject3.getInteger("age");
String sex=jsonObject3.getString("sex");
System.out.println("姓名"+name+" 年龄"+age+" 性别"+sex);
System.out.println(student3.toString());
System.out.println(jsonstr3+"n");

javascript 对象转json-json从成佛到成佛

对应的输出结果与预期一致:

json字符串、JSONObject和Java集合相互转换

上面已经进行了一些基于javabean的转换和操作,下面我们将对java集合进行一些转换。 看看fastjson使用了哪些参数。 Java的Map是常用的集合之一。 我们看一下Map的相关变换:

//map的相关转化
Mapmap1=new HashMap();
map1.put("name","xiaoming");map1.put("sex","woman");
String jsonstr=JSON.toJSONString(map1);//Map转json字符串
JSONObject jsonObject=(JSONObject) JSON.toJSON(map1);//Map转json对象
System.out.println(jsonstr);
System.out.println(jsonObject.toString());
//Mapmap2=JSON.parseObject(jsonstr,Map.class);//方式一
Mapmap2=JSON.parseObject(jsonstr,new TypeReference<Map>(){});//方式二json字符串转Map
Mapmap3=jsonObject.toJavaObject( new TypeReference<Map>(){});//JSONObject
System.out.println(map2.toString());
System.out.println(map3.toString());

控制台输出为:

另外,List也是java中使用最多的集合之一,我们可以看一下它的相关转换:

//List相关转化
List<Map>list1=new ArrayList();//集合
Mapmap1=new HashMap();
map1.put("name","map1");
Mapmap2=new HashMap();
map1.put("name","map2");map2.put("sex","man");
list1.add(map1);list1.add(map2);
String jsonstr=JSON.toJSONString(list1);//list转json字符串
JSONArray jsonArray =(JSONArray) JSON.toJSON(list1);//list转jsonArray
JSONObject jsonObject=jsonArray.getJSONObject(0);
System.out.println(jsonstr);
System.out.println(jsonArray+" "+jsonArray.get(0));
//json 字符串转list
List<Map>list2=JSON.parseObject(jsonstr,new TypeReference<ArrayList<Map>>(){});
//Listlist3=JSON.parseArray("",student.class);//普通list的转换方式
System.out.println(list2.get(0).equals(map1)+" "+list2.get(1).equals(map2));//如果相等则证明成功序列化
System.out.println(list2.toString());

结果输出是:

不难看出fastjson上手非常简单。 而且和Gson有很多相似之处。 在Api设计方面,Gson需要一个Gson对象来执行相关操作,而fastjson的JSON、JSONObject、JSONArray定义了很多可以直接使用的静态方法。 同时两者反序列化后的TypeToken(Gson)和TypeReference(fastjson)也类似。

这三个在开发过程中用的比较多,各有各的优缺点,这里只介绍上面的一小部分。 如果想了解更多,需要了解官方综合API(Gson官方API、fastjson官方文档)。 但是对于fastjson来说,可能有些地方存在一些漏洞和不稳定的原因,但是阿里很快就修复了。 因此,实际使用中必须考虑fastjson的安全性。

(练习)介绍完我们国外的开源技术——fastjson,接下来让我看看我对fastjson的掌握程度如何,测试一下你:下面这个类不是fastjson(D)

开源高度认可,Jackson也是真正的王者 Jackson介绍

最后我们介绍的是目前比较成熟的杰克逊。 jackson是一个可以将java对象序列化为json字符串以及将json字符串反序列化为java对象的框架。 下图是Jackson在github上的主页:

事实上,jackson的应用范围非常广泛。 这里我们先简单了解一下jackson,然后对比分析三个json工具包的优缺点。 对于jackson来说,它有以下优点:

杰克逊战斗

带你去练习杰克逊吧。 使用Gson和fastjson时,只需要引用一个jar即可,但jackson并没有将所有东西都整合到一个jar中javascript 对象转json,而是将其分成多个不同的模块(不同的模块有不同的功能)。 我们先介绍一下Jackson的依赖:



    com.fasterxml.jackson.core
    jackson-core
    2.11.0


    com.fasterxml.jackson.core
    jackson-databind
    2.11.0


    com.fasterxml.jackson.core
    jackson-annotations
    2.11.0

有了 Jackson 依赖,我们就可以开始实战了。 Jackson中操作json有3种方式:

javaBean与json字符串之间的转换 对于javaBean,我们创建student类(注意使用jackson的类必须有空参数构造函数):

public class student {
    private String name;
    private int age;
    private String sex;
    public student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public student(){}//空参构造器
    //get set方法 toString方法
}

在测试代​​码中,首先创建一个ObjectMapper对象,序列化和反序列化都需要该对象。 然后按照writeValueAsString()函数将java对象转换成json字符串(序列化)。 json字符串可以通过readValue()转换为java对象(反序列化)。 代码显示如下:

//创建 ObjectMapper对象
ObjectMapper mapper=new ObjectMapper();
//序列化的实体类
student stubigsai=new student("bigsai",6,"man");
//writeValueAsString()方法进行序列化
String stubigsaistr=mapper.writeValueAsString(stubigsai);
System.out.println(stubigsaistr+"n");
//反序列化的json字符串
String stuxiaohongstr="{"name":"xiaohong","age":8,"sex":"woman"}";
//readValue()方法进行反序列化
student stuxiaohong= mapper.readValue(stuxiaohongstr,student.class);
System.out.println(stuxiaohong.toString());

执行上述代码的结果是:

java集合和json字符串相互转换

除了javaBean和json字符串之间的转换之外,java集合和json字符串之间的转换也很简单。 这里我们只演示java Map和json字符串的相互转换。 这个过程有点类似于上面提到的javaBean和json之间的转换。 需要注意的是,在从json转换为Map对象(或其他子类对象)时,由于Java类型擦除,一些难以直接正确转换的类型需要通过new TypeReference自动给出。 示例代码如下:

//创建 ObjectMapper实体类
ObjectMapper mapper=new ObjectMapper();
//需要序列化的Map和List
Mapmap1=new HashMap();
map1.put("博学谷","666");map1.put("bigsai",666);//注意两个666类型不同
map1.put("string",new String[]{"bigsai", "博学谷"});
//序列化结果
String map1str=mapper.writeValueAsString(map1);
System.out.println(map1str+"n");
//方式一反序列化结果
Mapm1=mapper.readValue(map1str,Map.class);
//方式二TypeReference指定反序列化类型(适合泛型和复杂类型)
Mapm2=mapper.readValue(map1str, new TypeReference<Map>() {});
System.out.println(m1.toString());
System.out.println(m2.toString());

执行结果为:

看完例子,你有没有发现:哇,这两者很相似。 是的,一个优秀的开源框架不仅要考虑它的功能和性能,还要考虑它的易用性、用户友好性、框架的官方性。 文件等也是非常重要的指标! 当然,这只是jackson功能的九牛一毛。 想要更详细、更深入的学习,需要查阅jackson官方文档。

Gson VS fastjson VS jackson

现在已经介绍了三个java序列化/反序列化json框架。 这三个都是特别优秀的框架,这是毫无疑问的,但是一对比,就有些害处了(哎哎哎)。

名称:GsonfastjsonJackson社区生态比较好,平时比较好,易用性好,而且平时小文件速度最快又慢,大文件速度慢,快又快,稳定一般稳定,安装包大小很大小并且通常很小

总结一下: Gson:轻量、简单,适合解析中小型json文件。 对大型json文件效率稍差,但功能更全面,生态也更好。 jackson:处理大文件速度比fastjson更快,也更稳定。 生态比较好。 fastjson:速度更快,但经常暴露安全问题。 生态学一般主要在国外使用。

json框架的选择主要是根据自己的需求。 如果是测试或者个人使用的话就比较简单了。 推荐Gson和fastjson上手比较容易。 如果需要上线,那么fastjson一定要谨慎使用,有些数据可能会序列化失败。

介绍的最后,我要暗自夸一下fastjson的主要贡献者文少,不仅是fastjson的开源,也是另一个开源框架——druid(阿里巴巴数据库连接池)的主要贡献者,所以作者很努力,致力于开源事业,服务更多的人,点赞! ! ! 希望以后我们也能像文少一样有所作为! 快点!

到这里,json的介绍,json句型的使用,以及Gson/fastjson/jackson的一些实用介绍就已经完成了。 JSON很简单,但是json也可能很复杂,这取决于你具体的业务用途和需求,希望在以后的日子里,能够对json的理解和应用有更深入的了解! 来吧,我们下次再见!

(单选)既然你已经比较了Gson、fastjson、Jackson,侄儿姐妹们,让我测试一下你对两者的理解,那么问题来了,你能告诉我下面哪一个是错误的吗? (二)

小型斩波器

上面说了这么多,掌握java中json的操作对于我们来说是非常重要的,所以我们先从一个小小的转换案例开始吧。 这里我们需要使用Gson和fastjson来转换以下对象:

javaBean 转 json 字符串

Suppose we have a teacher class with two attributes: name and age.

public class teacher {
    private String name;
    private int age;
    //省略get  set 以及构造函数
}

First we have an object

teacher teachersai=new teacher("bigsai",22);

Think about it, what does the json format string of this object look like?

Yes, the answer is this:

{"name":"bigsai","age":22}

If it is Gson, we operate like this:

Gson gson=new Gson();
String teacherstr=gson.toJson(teachersai);
System.out.println(teacherstr);//{"name":"bigsai","age":22}

And if it is fastjson, what will it look like?

String teacherstr=JSON.toJSONString(teachersai);
System.out.println(teacherstr);//{"name":"bigsai","age":22}

This completes the conversion of java objects into json strings. Isn't it very simple, because fastjson writes many methods in JSON as static static, so we don't even need to create this object.

json string to javaBean

Above we can easily convert javaBean into a json string, if we have such a string that needs to be converted into a java teacher object, what should we do?

String teacherpian="{"name":"bigpian","age":21}";//{"name":"bigpian","age":21}

Then creating the Gson object only requires one line of code:

Gson gson=new Gson();
teacher teacherp=gson.fromJson(teacherpian,teacher.class);

In the same way, our fastjson can also be done with one line of code:

teacher teacherp=JSON.parseObject(teacherpian,teacher.class);

这简单吗? Of course, if you are diligent and eager to learn, you will definitely find that there are other ways of writing. Practice depends on the individual, and you will definitely need to discover more usages by yourself!

本文摘要

This is the end of the relaxed and pleasant json introduction course. Through this course, you understand the concept of json, distinguish the advantages and disadvantages of json and xml, and also know the applications of json in the web field and non-relational databases. Through the series of introductions, comparisons, and actual scenarios, I believe you will have a very clear understanding of json.

Immediately afterwards, the article introduced the grammatical rules of json and the actual operation of json in java, learned and compared the application of Gson, fastjson, jackson and the differences between them, I believe you have also grasped the json in java language Practical capabilities, and the flexibility to use which framework according to your own needs, and conduct in-depth research.

JSON is a product of the progress and development of web technology. It is a data exchange format. It is almost an inevitable technical point for front-end programmers. I hope you can review the course more in the future, combined with other textbooks, etc., to transform json from the ground to the Buddha! Come on, see you last time!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 javascript javascript 对象转json-json从成佛到成佛 https://www.wkzy.net/game/190321.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务