JSON简介

JSON简介

JSON 是一种与开发语言无关的、轻量级的数据格式 – JavaScript Object Notation

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

优点:易于人的阅读和编写,易于程序的解析和生产
基本格式:{key:value}

标准的json数据表示
数据结构:Object、Array
基本类型:String、number、true、false、null

数据结构——object
使用花括号{}包含的键值对结构,key必须是String类型,value为任何基本类型或数据结构
数据结构——Array
使用中括号[]来起始,并用逗号来分割元素

下面这个网站可以帮助你解析json字符串,并生成文件:
JSON Editor Online

具体资料可以查阅–>JSON中文官方网站
这里还有所有语言的示例代码以及相关工具等等内容,十分详尽,如

利用org.Json构建json数据

利用org.Json在Java中使用JSONObject对象

Json是Android SDK的官方库
适合移动端开发

例子 JSON和对象的转换,在pom.xml中添加依赖包

测试类

输出

Json在Java中使用字符串生成JSONObject对象

Json在Java中使用MAP生成JSONObject对象

Json在Java中使用JavaBean对象来生成JSONObject对象

从文件读取JSON数据

依赖

测试文件的内容 与测试类文件同级 名为success_message.json

测试类中的测试方法

使用Gson 来更加灵活的构建json数据

gson是google提供的开源api
Gson功能更强大可以在json格式和javaObject之间通过反射灵活转换
更适合服务端后台的开发

  • 优点:
  • 1.轻量, 支持将json字符串反向生成指定类的对象
  • 2.支持日期格式

使用Gson生成json

pom.xml 添加依赖

测试类和测试方法

使用gsonBuilder定制json的转换规则

使用gson反向将json字串转换成指定类

message.json文件内容如下:

测试类

测试方法

反向将json字串转换成指定带有时间属性的类

gson转换会自动将数组值映射成实体类对应的集合属性

注意Map会被映射成google自定义的Map类型..

jackson实现Json序列化和反序列化

利用fasterxml.jackson实现JSON序列化和反序列化

Gradle依赖
fasterxml.jackson依赖jackson-core, jackson-databind和jackson-annotations.
示例如下:

序列化和反序列化实现

JSON工具类
我们构造一个JSON工具类,实现JSON序列化和反序列化, 主要用到的类为com.fasterxml.jackson.databind.ObjectMapper, 代码示例如下:

Entity
为测试我们编写的JSON工具类, 定义一个Entity对象。
为了构建的Entity对象被JSON工具类操作, 关于Entity有几点说明:

  • Entity对象必须有默认构造函数
  • 成员变量必须有对应的Setter方法
  • 可选: 可通过@JsonProperty自定义序列化和反序列化对应的字符的名称,如@JsonProperty(“UID”),则序列化时uid字段显示为UID,同理反序列化时找到字符串中UID对应的值,复制给uid。
  • 可选:可通过@JsonIgnore注解,过滤掉不需要进行序列化的成员变量。

示例如下:

单元测试

编写单元测试,测试Entity的序列化和反序列化, 示例如下:

输出结果如下:
entity的序列化结果, 显示字段UID
{"UID":"James","name":"James"}

entity的序列化结果
James:James

UnrecognizedPropertyException异常解决

通过上面的介绍, 我们基本了解了JSON的序列化和反序列化,不过有时我们会遇到一种问题。
考虑这样一种情况,我们针对Http接口返回的JSON字符串,构建了一个具体的Entity对象,但是当Http接口中突然增加了一个字段type,如果还是按照原来方式解析会如何呢?

出现UnrecognizedPropertyException异常:

即对于新添加的type字符无法识别。如何解决这个问题呢?我们这里提供2种方法。

  • 方法1 JsonIgnoreProperties注解
    利用fasterxml.jackson提供的@JsonIgnoreProperties注解,针对无法识别的属性进行过滤。这里主要是修改需要进行反序列化的对象Entity,示例如下:
    针对无法识别的属性进行过滤
  • 方法2 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
    方法1的修改需要对每一个需要进行反序列化的类进行修改, 不太方便。
    方法2通过修改JSON工具类的反序列化方法,设置DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES的值为false, 可以仅一次修改就适用全部对象。
    示例如下:

Views: 18