json详解

概述

JSON 是一种轻量级的数据交换格式,它是基于 JavaScript 的一个子集,采用完全独立于编程语言的格式来表示数据,可以跨语言、跨平台使用。简洁清晰的层次结构使得 JSON 逐渐替代了 XML,成为了最理想的数据交换格式,广泛应用于 Web 开发领域。
JSON 全称“JavaScript Object Notation”,译为“JavaScript 对象简谱”或“JavaScript 对象表示法”,是一种轻量级的、基于文本的、开放的数据交换格式。JSON 在 Web 开发领域有着举足轻重的地位,如果您想在 Web 开发领域大展身手的话,就必须了解 JSON。
数据交换是指,两个设备之间建立连接并互相传递数据的过程。
尽管 JSON 的名称中包含“JavaScript”,但它并不是只能在 JavaScript 中使用,大多数编程语言都支持 JSON(有些本身就支持,有些可以通过第三方库得到支持),例如 JavaScript、Java、PHP、Python、C++ 等。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
JSON 是一种用于数据交换的文本格式,诞生于 2001 年由Douglas Crockford提出,目的是取代繁琐笨重的XML格式。这种格式不仅人很容易进行阅读和编写,同时机器也很容易解析和生成,是当前十分流行的数据格式,尤其是在前端领域。
JSON,全称是 JavaScript Object Notation,即 JavaScript 对象标记法。这是一种 轻量级
(Light-Weight)、 基于文本的 (Text-Based)、 可读的 (Human-Readable)格式。
JSON 无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比 XML 文件更小;
JSON 格式的创始人声称此格式永远不升级,这就表示这种格式具有长时间的稳定性;
JSON格式有两个显著的优点:书写简单,一目了然;符合JavaScript原生语法,可以由解释引擎直接处理,不用另外添加解析代码。
JSON已经成为各大网站交换数据的标准格式,并被写入ECMAScript 5,成为标准的一部分。
简单说,每个JSON对象,就是一个值。要么是简单类型的值,要么是复合类型的值,但是只能是一个值,不能是两个或更多的值。这就是说,每个JSON文档只能包含一个值。

JSON对值的类型和格式有严格的规定
复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
简单类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity,-Infinity和undefined)。
字符串必须使用双引号表示,不能使用单引号。
对象的键名必须放在双引号里面。
数组或对象最后一个成员的后面,不能加逗号。
PS: 需要注意的是,空数组和空对象都是合格的JSON值,null本身也是一个合格的JSON值。

JSON 发展史

2000 年初,Douglas Crockford(道格拉斯·克罗克福特)发明了 JSON,并从 2001 年开始推广使用。同年 4 月,位于旧金山湾区某车库的一台计算机发出了首个 JSON 格式的数据,这是计算机历史上的重要时刻。
2005-2006 年,JSON 正式成为主流的数据格式,雅虎、谷歌等知名网站开始广泛使用 JSON 格式。
2013 年,ECMA International(欧洲计算机制造商协会)制定了 JSON 的语法标准——ECMA-404。
经过 20 年左右的发展,JSON 已经替代了 XML,成为了 Web 开发中首选的数据交换格式。

什么是 JSON

JSON 是一种纯字符串形式的数据,它本身不提供任何方法(函数),非常适合在网络中进行传输。JavaScript、PHP、Java、Python、C++ 等编程语言中都内置了处理 JSON 数据的方法。
JSON 是基于 JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集,是一种开放的、轻量级的数据交换格式,采用独立于编程语言的文本格式来存储和表示数据,易于程序员阅读与编写,同时也易于计算机解析和生成,通常用于在 Web 客户端(浏览器)与 Web 服务器端之间传递数据。

为什么要使用 JSON

JSON 并不是唯一能够实现在互联网中传输数据的方式,除此之外还有一种 XML 格式。JSON 和 XML 能够执行许多相同的任务,那么我们为什么要使用 JSON,而不是 XML 呢?
之所以使用 JSON,最主要的原因是 JavaScript。众所周知,JavaScript 是 Web 开发中不可或缺的技术之一,而 JSON 是基于 JavaScript 的一个子集,JavaScript 默认就支持 JSON,而且只要您学会了 JavaScript,就可以轻松地使用 JSON,不需要学习额外的知识。
另一个原因是 JSON 比 XML 的可读性更高,而且 JSON 更加简洁,更容易理解。
与 XML 相比,JSON 具有以下优点:
结构简单、紧凑:与 XML 相比,JSON 遵循简单、紧凑的风格,有利于程序员编辑和阅读,而 XML 相对比较复杂;
更快:JSON 的解析速度比 XML 更快(因为 XML 与 HTML 很像,在解析大型 XML 文件时需要消耗额外的内存),存储同样的数据,JSON 格式所占的存储空间更小;
可读性高:JSON 的结构有利于程序员阅读。

JSON 的不足

任何事物都不可能十全十美,JSON 也不例外,比如:
只有一种数字类型:JSON 中只支持 IEEE-754 双精度浮点格式,因此您无法使用 JSON 来存储许多编程语言中多样化的数字类型;
没有日期类型:在 JSON 中您只能通过日期的字符串(例如:1970-01-01)或者时间戳(例如:1632366361)来表示日期;
没有注释:在 JSON 中无法添加注释;
冗长:虽然 JSON 比 XML 更加简洁,但它并不是最简洁的数据交换格式,对于数据量庞大或用途特殊的服务,您需要使用更加高效的数据格式。

JSON 应该如何存储

JSON 数据可以存储在 .json 格式的文件中(与 .txt 格式类似,都属于纯文本文件),也可以将 JSON 数据以字符串的形式存储在数据库、Cookie、Session 中。
要使用存储好的 JSON 数据也非常简单,不同的编程语言中提供了不同的方法来检索和解析 JSON 数据,例如 JavaScript 中的 JSON.parse() 和 JSON.stringify()、PHP 中的 json_decode() 和 json_encode()。

什么时候会使用 JSON

简单了解了 JSON 之后,我们再来看看什么时候适合使用 JSON。

1) 定义接口

JSON 使用最多的地方莫过于 Web 开发领域了,现在的数据接口基本上都是返回 JSON 格式的数据,比如:
使用 Ajax 异步加载的数据;
RPC 远程调用;
前后端分离,后端返回的数据;
开发 API,例如百度、高德的一些开放接口。
这些接口一般都会提供一个接口文档,说明接口调用的方法、需要的参数以及返回数据的介绍等。

2) 序列化

程序在运行时所有的变量都是存储在内存中的,如果程序重启或者服务器宕机,这些数据就会丢失。一般情况下运行时变量并不是很重要,丢了就丢了,但有些数据则需要保存下来,供下次程序启动或其它程序使用。
我们可以将这些数据保存到数据库中,也可以保存到一个文件中,这个将内存中数据保存起来的过程称为序列化。序列化在 Python 中称为 pickling,在其他语言中也被称为 serialization、marshalling、flattening 等等,都是一个意思。
通常情况下,序列化是将程序中的对象直接转换为可保存或者可传输的数据,但这样会保存对象的类型信息,无法做到跨语言使用,例如我们使用 Python 将数据序列化到硬盘,然后使用 Java 来读取这份数据,这时由于不同编程语言的数据类型不同,就会造成读取失败。如果在序列化之前,先将对象信息转换为 JSON 格式,则不会出现此类问题。

3) 生成 Token

Token 的形式多种多样,JSON、字符串、数字等都可以用来生成 Token,JSON 格式的 Token 最有代表性的是 JWT(JSON Web Tokens)。
随着技术的发展,分布式 Web 应用越来越普及,通过 Session 管理用户登录状态的成本越来越高,因此慢慢发展为使用 Token 做登录身份校验,然后通过 Token 去取 Redis 中缓存的用户信息。随着之后 JWT 的出现,校验方式变得更加简单便捷,无需再通过 Redis 缓存,而是直接根据 Token 读取保存的用户信息。

4) 配置文件

我们还可以使用 JSON 来作为程序的配置文件,最具代表型的是 npm(Node.js 的包管理工具)的 package.json 包管理配置文件,如下所示:
{
“name”: “server”,
“version”: “0.0.0”,
“private”: true,
“main”: “server.js”,
“scripts”: {
“start”: “node ./bin/www”
},
“dependencies”: {
“cookie-parser”: “~1.4.3”,
“debug”: “~2.6.9”,
“express”: “~4.16.0”,
“http-errors”: “~1.6.2”,
“jade”: “~1.11.0”,
“morgan”: “~1.9.0”
}
}

提示:虽然 JSON 可以用来定义配置文件,但由于 JSON 中不能添加注释,使得配置文件的可读性较差。
JSON 的语法规则

在 JSON 中,使用以下两种方式来表示数据:
Object(对象):键/值对(名称/值)的集合,使用花括号 { } 定义。在每个键/值对中,以键开头,后跟一个冒号:,最后是值。多个键/值对之间使用逗号, 分隔,例如{“name”:“C语言中文网”,“url”:“http://c.biancheng.net”};
Array(数组):值的有序集合,使用方括号 [ ] 定义,数组中每个值之间使用逗号, 进行分隔。
下面展示了一个简单的 JSON 数据:
{
“Name”:“C语言中文网”,
“Url”:“http://c.biancheng.net/”,
“Tutorial”:“JSON”,
“Article”:[
“JSON 是什么?”,
“JSONP 是什么?”,
“JSON 语法规则”
]
}
JSON 的语法规则十分简单,可称得上“优雅完美”,总结起来有:
数组(Array)用方括号(“[]”)表示。
对象(Object)用大括号(”{}”)表示。
名称/值对(name/value)组合成数组和对象。
名称(name)置于双引号中,值(value)有字符串、数值、布尔值、null、对象和数组。
并列的数据之间用逗号(“,”)分隔

//json对象
{
“name”: “Geoff Lui”,
“age”: 26,
“isChinese”: true
}

//“名称/值对”里,值可以是数组和对象,例如:
{
“name”: “Geoff Lui”,
“age”: 26,
“isChinese”: true,
“friends”:[“Lucy”, “Lily”, “Gwen”],
“Mother”: {
“name”: “Mary Lui”,
“age”: 54
}
}

Json是一种轻量级的数据交换格式,采用一种“键:值”对的文本格式来存储和表示数据,在系统交换数据过程中常常被使用,是一种理想的数据交换语言。在使用Java做Web开发时,不可避免的会遇到Json的使用。下面我们就简单讲一下Json的使用以及fastjson.jar包的使用。

Json分类

json-lib

    json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括commons-beanutils.jar,commons-collections.jar,commons-lang.jar,commons-logging.jar,ezmorph-1.0.6.jar,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。

json-lib在功能和性能上面都不能满足现在互联网化的需求。

开源的Jackson

   相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式。

Jackson:Jackson是一个广泛使用的高性能JSON处理库,由FasterXML开发和维护。它提供了一套强大的API,可以进行JSON的序列化和反序列化操作。Jackson支持注解配置、数据绑定和树模型等多种处理方式。示例代码:
CodeObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(object); // 对象序列化为JSON
MyClass obj = objectMapper.readValue(json, MyClass.class); // JSON反序列化为对象

Google的Gson

  Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。

而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。

  1. Gson:Gson是Google提供的一个简单易用的JSON处理库,适用于Android开发和普通Java项目。它提供了简洁的API,支持对象的序列化和反序列化,并具有良好的性能表现。示例代码:
    CodeGson gson = new Gson();
    String json = gson.toJson(object); // 对象序列化为JSON
    MyClass obj = gson.fromJson(json, MyClass.class); // JSON反序列化为对象

阿里巴巴的FastJson

   Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。

FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
综上4种Json技术的比较,在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,如果只是功能要求,没有性能要求,可以使用google的Gson,如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean。
Fastjson:Fastjson是阿里巴巴开源的一个快速、功能强大的JSON处理库。它具有很高的性能和灵活的特性,支持注解配置和各种数据类型的转换。示例代码:
CodeString json = JSON.toJSONString(object); // 对象序列化为JSON
MyClass obj = JSON.parseObject(json, MyClass.class); // JSON反序列化为对象

JSON.simple

JSON.simple是一个轻量级的JSON处理库,提供了简单的API来处理JSON数据。它适用于简单的JSON操作和较小的项目,但在性能和功能方面相对较弱。示例代码:
CodeJSONObject jsonObject = new JSONObject();
jsonObject.put(“key”, “value”); // 添加键值对
String json = jsonObject.toJSONString(); // 对象序列化为JSON

JSONObject parsedObject = (JSONObject) JSONValue.parse(json); // JSON反序列化为对象
这些JSON类库各有特点,可以根据项目需求和个人偏好选择合适的类库。它们都提供了简单易用的API来进行JSON的序列化和反序列化操作,并具有不同的性能和功能特性。

JSON 序列化方式有哪些

在Java中,进行JSON序列化有多种方式,以下是一些常见的JSON序列化方式和工具:

  1. Gson:Gson是Google提供的一个用于Java对象和JSON数据之间的序列化、反序列化的库。通过Gson可以方便地将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。
  2. Jackson:Jackson是另一个流行的用于处理JSON数据的Java库,它提供了多种方法来实现对象和JSON之间的转换,包括基于注解的方式和简单的API。
  3. org.json:Java标准库中也提供了JSON处理的相关类,比如JSONObject和JSONArray,可以用来处理简单的JSON数据。
  4. Fastjson:阿里巴巴开发的Fastjson是一个性能优秀的JSON处理库,提供了丰富的功能和灵活的配置选项,被广泛应用于各种Java项目中。
  5. Moshi:Square开发的Moshi是另一个优秀的JSON库,专注于性能和简洁性,适用于Android开发以及一般的Java应用程序。
  6. Spring框架:在Spring框架中,可以使用@RestController注解返回Java对象,Spring会自动将其序列化为JSON格式的响应。也可以使用@ResponseBody注解或ResponseEntity对象来实现JSON序列化。
  7. JAXB:Java Architecture for XML Binding (JAXB) 是Java EE平台的一部分,可以用于将Java对象和XML/JSON数据相互转换。
    以上是一些常用的在Java中进行JSON序列化的方式和工具,你可以根据自己的需求和喜好选择合适的工具来实现对象和JSON数据之间的转换。每种工具都有自己的特点和适用场景,可以根据项目需求选择最合适的方式。

消息队列中传输的数据格式JSON 对象还是 JSON 字符串

选择消息队列中传输的数据格式,可以根据您的具体需求和场景来决定使用 JSON 对象还是 JSON 字符串。
使用 JSON 对象作为消息格式的优点包括:

  1. 结构化:JSON 对象提供了结构化的数据表示形式,可以方便地表示复杂的数据结构,并且可以直接通过属性名来访问数据,使数据处理更加简单。
  2. 类型安全:JSON 对象中的属性名和属性值可以有类型信息,可以避免在处理消息时发生类型错误,并提供更好的类型安全性。
  3. 可读性:JSON 对象相对于纯文本的 JSON 字符串来说,在可读性方面更好,可以更直观地理解消息的内容。
  4. 扩展性:JSON 对象可以轻松地添加、删除或修改属性,以适应未来可能的数据结构变化。
    而使用 JSON 字符串作为消息格式的优点包括:
  5. 简洁性:相比于 JSON 对象,JSON 字符串的表示形式更加简洁,可以减少消息的传输大小。
  6. 互操作性:JSON 字符串是一种通用的数据表示形式,在不同编程语言和平台之间更容易进行数据传输和解析。
  7. 兼容性:由于 JSON 字符串是一种标准格式,在许多消息队列系统和其他应用程序中都有广泛的支持。
    因此,选择 JSON 对象还是 JSON 字符串主要取决于您的需求和偏好。如果需要更好的可读性、类型安全性和扩展性,可以选择 JSON 对象;如果追求简洁性、互操作性和兼容性,可以选择 JSON 字符串。
    在实际应用中,通常可以根据具体场景和需求来灵活选择使用 JSON 对象或 JSON 字符串作为消息格式。

指定JSON字段与Java属性之间的映射关系的注解

fastjson的JSONField和Jackson的JsonProperty注解是用于在序列化和反序列化过程中指定JSON字段与Java属性之间的映射关系的注解。

1. fastjson.JSONField注解:

JSONField注解可用于字段或方法上,用于指定JSON字段与Java属性之间的映射关系。
示例代码:

public class User {
    @JSONField(name = "user_name")
    private String userName;

    // getter和setter方法

    // 示例方法上的使用
    @JSONField(name = "age")
    public int getAge() {
        // ...
    }
}

2. jackson.annotation.JsonProperty注解:

JsonProperty注解可用于字段或方法上,用于指定JSON字段与Java属性之间的映射关系。
示例代码:

public class User {
    @JsonProperty("user_name")
    private String userName;

    // getter和setter方法

    // 示例方法上的使用
    @JsonProperty("age")
    public int getAge() {
        // ...
    }
}

这两个注解的功能相似,都是用于定义JSON字段名与Java属性名之间的映射关系。它们主要的区别在于:
● 包:JSONField注解属于fastjson库,而JsonProperty注解属于Jackson库。
● 特性:JSONField注解提供了更多的特性和选项,如日期格式化、序列化顺序控制等;而JsonProperty注解相对简单,主要用于指定字段名。
根据实际使用情况和所使用的JSON库,选择适合的注解来定义JSON字段与Java属性之间的映射关系。

json工具

开发工具-Hijson
离线json-Hijson
JSON Viewer是Notepad++的JSON插件, Notepad++的Plugins Admin可以安装管理插件, 它不仅可以格式化JSON字符串, 还可以打开JSON查看器查看结构化的JSON。
使用在线 JSON 格式化工具,例如:https://jsonformatter.curiousconcept.com/
https://jsonformatter.org/
https://codebeautify.org/jsonviewer 使用代码编辑器的自带工具。
json在线
https://www.sojson.com/
https://www.json.cn/
Json Parser json串格式化工具,不用打开浏览器了 JSON Parser是用于验证和格式化JSON字符串的轻量级插件

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
task.json 是 Visual Studio Code 编辑器中的一个配置文件,用于定义任务(Task)的相关信息,包括任务的命令、参数、工作目录、输入输出、启动配置等。通过 task.json 文件,可以方便地配置、管理和运行各种任务。 task.json 中的常用参数包括: - label:任务的标签,用于在任务列表中显示。 - type:任务的类型,可以是 "shell"、"process" 或 "npm" 等。 - command:执行任务的命令。 - args:执行任务命令的参数。 - problemMatcher:用于匹配命令输出中的错误信息,并在编辑器中显示错误提示。 - options:任务的额外选项,例如设置任务执行时的工作目录、环境变量等。 - presentation:任务在编辑器中的显示设置,例如是否在终端中显示执行输出。 任务可以通过任务列表或者快捷键进行运行。任务列表显示了所有的任务,可以选择性地运行某个任务。此外,还可以通过快捷键将任务与编辑器的某个功能进行关联,从而实现快速执行任务。 在 task.json 文件中,常见的任务配置包括: - 编译项目:通过配置编译器的命令和参数,可以在任务列表中快速编译代码。 - 运行测试:配置测试框架的命令和参数,可以方便地运行测试用例进行调试。 - 启动服务:通过配置启动服务的命令和参数,可以在任务列表中一键启动服务。 - 打包应用:配置打包工具的命令和参数,可以自动化生成可部署的应用程序。 总之,task.json 是 Visual Studio Code 编辑器中用于配置和管理任务的关键配置文件,通过它可以提高开发效率,简化操作,实现自动化和快速执行各种任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值