jsonobject使用详解(json object的各种用法)

admin 347 0

大家好,今天小编来为大家解答jsonobject使用详解这个问题,json object的各种用法很多人还不知道,现在让我们一起来看看吧!

一、java里的JSONObject作用是什么什么时候用

JsonObject就是常说的 json。是一种重要的数据传输对象。其格式为{"key1":value1,"key2",value2....};key必须是字符串。

因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用。

通过response.getWriter()获取PrintWriter pw,然后pw.print(json)。如果没有设置response.setContentType("application/json; charset=utf-8");则需要自己再js中进行解析。

Java中交互方式分为同步和异步两种:

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;

异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

区别:一个需要等待,一个不需要等待,在部分情况下,项目开发中都会优先选择不需要等待的异步交互方式。

比如银行的转账系统,对数据库的保存操作等等,都会使用同步交互操作,其余情况都优先使用异步交互。

二、Android Gson 使用详解

1、 Json是一种文本形式的数据交换格式,比 xml更为轻量。Json的解析和生成的方式很多,在 Android平台上最常用的类库有 Gson和 FastJson两种,这里要介绍的是 Gson

2、 Gson的 GitHub主页点击这里: Gson

3、在进行序列化与反序列操作前,需要先实例化一个 com.google.gson.Gson对象,获取 Gson对象的方法有两种

4、利用 Gson可以很方便地生成 Json字符串,通过使用 addProperty的四个重载方法

5、 addProperty方法底层调用的是 add(String property, JsonElement value)方法,即将基本数据类型转化为了 JsonElement对象,JsonElement是一个抽象类,而 JsonObject继承了 JsonElement,因此我们可以通过 JsonObject自己来构建一个 JsonElement

6、 Gson也提供了 toJson()和 fromJson()两个方法用于转化 Model与 Json,前者实现了序列化,后者实现了反序列化

7、序列化的方法很简单,调用 gson对象的 toJson方法,传入要序列化的对象

8、继续使用上一节声明的 User类,根据 User类声明的各个属性名,移动端的开发者希望接口返回的数据格式即是如下这样的

9、如果没有和服务器端沟通好或者是 API改版了,接口返回的数据格式可能是这样的

10、如果继续使用上一节介绍的方法,那无疑会解析出错

11、 name属性值解析不到,所以为 null

12、此时为了兼顾多种格式的数据,就需要使用 SerializedName注解

13、根据 SerializedName的声明来看,SerializedName包含两个属性值,一个是字符串,一个是字符串数组,而字符串数组含有默认值

14、 SerializedName的作用是为了在序列化或反序列化时,指导 Gson如果将原有的属性名和其它特殊情况下的属性名联系起来

15、例如,修改 User类,为 name声明 SerializedName注解,注解值为 userName

16、在序列时,Json格式就会相应改变

17、在反序列化时也一样,能够解析到正确的属性值

18、还有个问题没解决,为了应对多种属性名不一致的情况,难道我们要声明多个 User类吗?这显然是不现实的,所以还需要为 User类设置多个备选属性名,这就需要用到 SerializedName注解的另一个属性值 alternate了。

19、以下几种情况都能够被正确的反序列化

20、有时候并不是所有的字段都需要进行系列化和反序列化,因此需要对某些字段进行排除,有四种方法可以来实现这种需求。

21、 Expose注解包含两个属性值,且均声明了默认值。Expose的含义即为“暴露”,即用于对外暴露字段,serialize用于指定是否进行序列化,deserialize用于指定是否进行反序列化。如果字段不声明 Expose注解,则意味着不进行序列化和反序列化操作,相当于两个属性值均为 false。此外,Expose注解需要和 GsonBuilder构建的 Gson对象一起使用才能生效。

22、 Expose注解的注解值声明情况有四种

23、按照如上的注解值,只有声明了 Expose注解且 serialize值为 true的字段才能被序列化,只有声明了 Expose注解且 deserialize值为 true的字段才能被反序列化

24、 Gson提供了@Since和@Until两个注解基于版本对字段进行过滤,@Since和@Until都包含一个 Double属性值,用于设置版本号。Since的意思是“自……开始”,Until的意思是“到……为止”,一样要和 GsonBuilder配合使用。

25、当版本( GsonBuilder设置的版本)大于或等于 Since属性值或小于 Until属性值时字段会进行序列化和反序列化操作,而没有声明注解的字段都会加入序列化和反序列操作

26、访问修饰符由 java.lang.reflect.Modifier提供 int类型的定义,而 GsonBuilder对象的 excludeFieldsWithModifiers方法接收一个 int类型可变参数,指定不进行序列化和反序列化操作的访问修饰符字段

27、 GsonBuilder类包含 setExclusionStrategies(ExclusionStrategy... strategies)方法用于传入不定长参数的策略方法,用于直接排除指定字段名或者指定字段类型

28、字段名为"intField"和字段类型为 double的字段都会被排除掉

29、 setExclusionStrategies方法在序列化和反序列化时都会生效,如果只是想指定其中一种情况下的排除策略或分别指定排除策略,可以改为使用以下两个方法

30、对于 Gson而言,在序列化时如果某个属性值为 null的话,那么在序列化时该字段不会参与进来,如果想要显示输出该字段的话,可以通过 GsonBuilder进行配置

31、默认的序列化后的 Josn字符串并不太直观,可以选择格式化输出

32、 TypeAdapter是一个泛型抽象类,用于接管某种类型的序列化和反序列化过程,包含两个抽象方法,分别用于自定义序列化和反序列化过程

33、定义 TypeAdapter的子类 UserTypeAdapter来接管 User类的序列化和反序列化过程

34、这里设定当 User类序列化时 Json中的Key值都是大写字母开头,反序列化时支持“name”和“Name”两种不同的 Json风格

35、可以看到 User类按照预定义的策略来完成序列化和反序列化了

36、 TypeAdapter将序列化和反序列操作都接管了过来,其实 Gson还提供了只接管序列化过程的接口,即 JsonSerializer

37、相对应的,JsonDeserializer接口提供了反序列化的接口

38、这里有个比较麻烦的地方,那就是在使用 TypeAdapter、JsonSerializer和 JsonDeserializer时,总需要调用 registerTypeAdapter方法进行注册,那有没有更简单的注册方法呢?

39、有的,Gosn还提供了另一个注解@JsonAdapter用于进行简单的声明

40、类似于这样,声明了 User类的序列化或反序列化操作由 UserTypeAdapter完成,注解的优先级高于 registerTypeAdapter方法

41、 TypeAdapterFactory是用于创建 TypeAdapter的工厂类,通过参数 TypeToken来查找确定对应的 TypeAdapter,如果没有就返回 null并由 Gson默认的处理方法来进行序列化和反序列化操作,否则就由用户预定义的 TypeAdapter来进行处理

42、这一篇文章好像写得太长了一点?Gson的知识点介绍到这里也差不多了,以后如果还发现新内容的话我会继续补充,现在就先这样啦

三、使用JSONObject转换之后字段丢失

1、 JSONObject.toJSONString(object),转换之后发现属性值为null的属性被删除掉了,查询资料之后发现需要使用SerializerFeature序列化属性:

2、 JSONObject.toJSONString(Object object, SerializerFeature... features)

3、 QuoteFieldNames———-输出key时是否使用双引号,默认为true

4、 WriteMapNullValue——–是否输出值为null的字段,默认为false

5、 WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null

6、 WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null

7、 WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null

8、 WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null

9、 JSONObject.toJSONString(data, SerializerFeature.WriteMapNullValue);

四、jsonobject怎么获取json中某个值

public static void jsonToBean(String data){

JSONArray array= new JSONArray(data);//将json字符串转成json数组

for(int i= 0; i< array.length(); i++){//循环json数组

JSONObject ob=(JSONObject) array.get(i);//得到json对象

String name= ob.getString("name");//name这里是列名称,获取json对象中列名为name的值

System.out.print(name);//输出name

java处理 json格式字符串:转成 JSONArray或 JSONObject类型

1、如果是JSONArray,格式:最外层是中括号,表示数组

格式: [{key:value},{key:value}... ]

语法:JSONArray array= JSONArray.parseArray(strs)

注:strs必须是json格式的字符串,以"[ ]"中括号开头结尾.否则会报错.

2、如果是JSONObject,格式:最外层是大括号,表示对象

语法::JSONObject result= JSONArray.parseObject(strs);

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!