码迷,mamicode.com
首页 > 编程语言 > 详细

【Java】JSONObject学习

时间:2019-11-06 10:25:23      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:传递   fast   java动态代理   ali   序列   end   理解   拷贝   异常   

介绍

  JSONObject只是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素。JSONObject可以很方便的转换成字符串,也可以很方便的把其他对象转换成JSONObject对象。

  JSON(JavaScript Object Notation的首字母缩写)是一种轻量级数据交换格式,最常用于客户端 - 服务器通信。它既易于读/写,又与语言无关。JSON值可以是另一个JSON 对象,数组,数字,字符串,布尔值(true / false)或null。也是后端开发中经常要接触的一个一个类,将要数据封装成json然后传递给前端。

依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.46</version>
</dependency>

JSONObject的接口

public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler {

技术图片

1.JSONObject继承自JSON ,JSON是Fastjson的一个主要类,常常需要调用JSON的两个方法:toJSONString(Object)【将指定的对象序列化成Json表示形式】和parseObject(String, Class)【将json反序列化为指定的Class模式】
2.JSONObject实现了Map<String, Object>,可见JSONObject是一个Map类型的数据结构,Map接口提供了很多操作map的方法,常用的增删改查。
3.JSONObject还实现了Cloneable, Serializable, InvocationHandler,说明JSONObject支持拷贝(并且JSONObject重写了clone方法),支持序列化与反序列化,InvocationHandler是通过一个代理实例零调用处理程序实现的接口,即标记使用Java动态代理机制。JDK文档指示:每个代理实例都有一个相关的调用处理程序。当一个方法是在一个代理实例调用,调用的方法进行编码并派遣其调用处理程序的invoke方法。

JSONObject的字段

技术图片

    private static final long         serialVersionUID         = 1L;
    private static final int          DEFAULT_INITIAL_CAPACITY = 16;

    private final Map<String, Object> map;

JSONObject有三个字段
1.serialVersionUID(版本标识)是 Java 为每个序列化类产生的版本标识,可用来保证在反序列时,发送方发送的和接受方接收的是可兼容的对象。如果接收方接收的类的 serialVersionUID 与发送方发送的 serialVersionUID 不一致,进行反序列时会抛出 InvalidClassException。序列化的类可显式声明 serialVersionUID 的值,如下:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 1L;

当显式定义 serialVersionUID 的值时,Java 根据类的多个方面(具体可参考 Java 序列化规范)动态生成一个默认的 serialVersionUID 。尽管这样,还是建议你在每一个序列化的类中显式指定 serialVersionUID 的值,因为不同的 jdk 编译很可能会生成不同serialVersionUID 默认值,进而导致在反序列化时抛出 InvalidClassExceptions 异常。所以,为了保证在不同的 jdk 编译实现中,其 serialVersionUID 的值也一致,可序列化的类必须显式指定 serialVersionUID 的值。另外,serialVersionUID 的修饰符最好是 private,因为 serialVersionUID 不能被继承,所以建议使用 private 修饰 serialVersionUID。【以上出自java.io.Serializable doc 文档】
2.DEFAULT_INITIAL_CAPACITY 默认初始容量,大小为16
3.map,用于存储的的容器,JSONObject常用的两种类型,LinkedHashMap(有序)和HashMap类型。默认初始大小为16。

JSONObject的构造器

技术图片

 最重要的构造器是public JSONObject(int initialCapacity, boolean ordered),其他构造器都直接调用此构造器。initialCapacity为初始容量,ordered为map是否有序

//构造容量为16个单位的HashMap作为JSONObject
public JSONObject(){
    //调用public JSONObject(int initialCapacity, boolean ordered)
    this(DEFAULT_INITIAL_CAPACITY, false);
}
//构造自定义Map<String, Object> 容器类型的JSONObject
public JSONObject(Map<String, Object> map){
    if (map == null) {
        throw new IllegalArgumentException("map is null.");
    }
    this.map = map;
}
//构造容量为16个单位JSONObject,可选择器容器是否有序:LinkedHashMap(true)、HashMap(false)
public JSONObject(boolean ordered){
    this(DEFAULT_INITIAL_CAPACITY, ordered);
}
//构造自定义初始大小的HashMap类型的JSONObject
public JSONObject(int initialCapacity){
    this(initialCapacity, false);
}

public JSONObject(int initialCapacity, boolean ordered){
    if (ordered) {
        map = new LinkedHashMap<String, Object>(initialCapacity);
    } else {
        map = new HashMap<String, Object>(initialCapacity);
    }
}

使用事例

//构造容量为16个单位的HashMap作为JSONObject
JSONObject jsonObject = new JSONObject();

//构造容量为16个单位JSONObject,可选择器容器是否有序:LinkedHashMap(true)、HashMap(false)
JSONObject jsonObject1 = new JSONObject(true);

 //构造自定义Map<String, Object> 容器类型的JSONObject
Map<String,Object> map = new ConcurrentHashMap<>(16);
JSONObject jsonObject2 = new JSONObject(map);

//自定义
JSONObject jsonObject3 = new JSONObject(32, false);

JSONObject的方法

JSONObject继承JSON但未重写的方法下面暂不列出。

 技术图片

技术图片

技术图片

 

 

 原文:https://blog.csdn.net/Butterfly_resting/article/details/100053544

【Java】JSONObject学习

标签:传递   fast   java动态代理   ali   序列   end   理解   拷贝   异常   

原文地址:https://www.cnblogs.com/jxd283465/p/11803510.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!