http请求/restful/序列化反序列化/JSON

Posted jokie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了http请求/restful/序列化反序列化/JSON相关的知识,希望对你有一定的参考价值。

1.为什么要实现Serializable

(1)将内存中的对象数据存在磁盘中持久化

(2)将对象从一个应用程序发送到另一个应用程序

实现Serializable接口可以把对象序列化为字节流,实现传输必须实现序列化。

使用时将字节流反序列化为对象,应用其创建的副本。


 

2.为什么网络传输时对象要序列化,而字符串就不用序列化

网络传输需要将对象转换成字节流传输,序列化可以将一个对象转化成一段字节编码,以便在网络上传输或者做存储处理,使用时再进行反序列;

而字符串不用序列化的原因是字符串String是已经实现了Serializable接口的,所以它已经是序列化了的。


 

3.http请求中的JSON

网络传输中使用字符串进行交互,JSON是一种特殊规范的字符串,有自己的格式规定,与String的显示形式一样,但本质不是String!各端都支持JSON串的格式,将JSON容易转化为String进行网络传输。

fastJson是java用来实现序列化与反序列化的工具:

(1)PSOT请求参数为params时,对应postman的调用形式是拼参数。

String response = RestHttpClient.httpPost(url, headerList, params);

其中参数params为Map。

(2)POST请求参数为Body时,参数为JSONString,即JSON样子的String,postman调用时

技术分享图片

如接口为

@RequestMapping(value = "toRefund", method = RequestMethod.POST)
public ServerResult<String> toRefund(@RequestBody final RefundRequestDto refundRequestDto)

程序调用时:

String response = RestHttpClient.httpPost(registerBasePath + refundSubmit, headers, JSON.toJSONString(refundRequestDto));

参数为JSONString,序列化为JSONString(即JSON形式的String,形式为JSON,本质为String)。fastJson中JSON.toJSONString(对象)将对象转为JSONString,进行网络传输。

得到的response也为String,JSONString。

转化为JSONObject(真正的JSON,比String增强了按key取值的功能),用

JSONObject object = JSON.parseObject(response);

JSON.parseObject(String)---->JSONObject,可以get值

object.getString("data")

String data是返回对象中的一个成员。

若要从JSONString得到对象,若返回的对象为Person,将其转化为JSONString的response回给调用方,调用方取得String的response后,还原为Person类

Person person = JSON.parseObject(response, Person.class);

还原时类Person中对应的成员参数名要对应一致。


 

4.上例中,Person对象序列化为JSONString时,成员变量要有对应的set,get方法,因为fastJson利用反射机制,调用get方法取值,set赋值。没有set无法序列化,没有get无法反序列化。

如Person类

class Person {
            int age =10;
            String name = "Kobe";

            public int getAge() {
                return age;
            }

            public void setAge(int age) {
                this.age = age;
            }

//            public String getName() {
//                return name;
//            }
//
//            public void setName(String name) {
//                this.name = name;
//            }
        }
Person person = new Person();
String string = JSON.toJSONString(person);
System.out.println("JSON.toJSONString(person) = " + string);


结果为:
JSON.toJSONString(person) = {"age":10}

name属性无法序列化。

JSONObject jsonObject = JSON.parseObject(string);
System.out.println("JSON.parseObject(string) = " + jsonObject);

结果为:
JSON.parseObject(string) = {"age":10}

序列化确实,反序列化也无法取到值。

所谓序列化指对象------->JSONString,反序列化指JSONString------>JSONObject或对象。

 

以上是关于http请求/restful/序列化反序列化/JSON的主要内容,如果未能解决你的问题,请参考以下文章

序列化,反序列化

无法通过 GET 反序列化数组

如何在 RESTful Flask 应用程序中序列化/反序列化 Pandas DataFrame 到 ProtoBuf/Gzip?

RESTful开发方式

RESTful开发方式

drf之框架基础