使用json-lib完成json的序列化和反序列化
Json的序列化和反序列化

Json的序列化和反序列化Json的序列化和反序列化⼀、Json简介 Json(JavaScript Object Notation) 是⼀种轻量级的数据交换格式。
它基于JS的⼀个⼦集。
Json采⽤完全独⽴于语⾔的⽂本格式。
这使得Json成为理想的数据交换语⾔。
易于⼈阅读和编写,同时也易于机器解析和⽣成。
Json简单来说就是JS中的对象和数组,所以Json也存在两种结构:对象、数组。
Json对象:Json对象定义在花括号“{}”内,以Key:value键值对的形式存放数据,多个数据使⽤分号“;”分割。
⼆、序列化Object obj = Serialization.JsonToObject<Object>(strJson);三、反序列化strJson = Serialization.ObjectToJSON(obj);四、⼯具类public static class Serialization{public static T JsonToObject<T>(string jsonText){DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(T));MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonText));T result = (T)((object)dataContractJsonSerializer.ReadObject(memoryStream));memoryStream.Dispose();return result;}public static string ObjectToJSON<T>(T obj){DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(T));string result = string.Empty;using (MemoryStream memoryStream = new MemoryStream()){dataContractJsonSerializer.WriteObject(memoryStream, obj);memoryStream.Position = 0L;using (StreamReader streamReader = new StreamReader(memoryStream)){result = streamReader.ReadToEnd();}}return result;}}。
Json的序列化和反序列化

Json 的序列化和反序列化⼀.什么是Json : 中午肚⼦饿了,到餐厅点餐。
向服务员点了⼏个菜,厨师根据⽤户的需求,开始烹饪⾷物,⾷物烹饪好后,怎么将⾷物呈现给⽤户呢?这时就需要⽤到盛放⾷物的碗了。
⽤户拿到盛放⾷物的碗,就可以获得点的餐了。
这个碗就充当了数据交换的容器了(^-^) 客户端向服务器端发送请求后,服务器端怎么才能把⽤户需要的数据返回给客户端呢。
这时我们就需要⽤⼀个指定的格式将数据,按照指定格式返回客户端。
这时就有了两种数据传输的⽅式(XML 和Json ): 在普通的Web 应⽤中,不管是服务器端还是客户端解析XML 代码会⾮常⿇烦,所以这时Json 就更加满⾜数据传输解析的要求。
采⽤Json 格式的⽅式进⾏数据的传输,不仅⽅便传输解析,还特别易于⼈阅读和编写⼆.XML 与Json 转换:1.常规转换:<emp ><name >fxhl </name ><city >深圳</city ><age >23</age ></emp >转换为Json 为: {“name”:“fxhl”,"city":"深圳","age":23}三.Json 的表现形式: 1.对象:{"returnCode": "R0000","returnMsg": "成功","lessTimes": "2","domainLink": "","seqNum": "1","identification": "595279","isNeedImageCode": "false"} 2.数组:{"employees": [{ "firstName":"John" , "lastName":"Doe" },{ "firstName":"Anna" , "lastName":"Smith" },{ "firstName":"Peter" , "lastName":"Jones" }]} 3.数组对象混合: 这是截取的⼀⼩部分,对于⽐较复杂的Json 格式的字符串,可以在线验证json 。
json序列化和反序列化方法

json序列化和反序列化方法JSON(JavaScriptObjectNotation,即JavaScript对象表示法)是一种轻量级的文本标记语言,它基于JavaScript语法来表示《键值对》中的数据结构,并且广泛的被用来传输、存储和交换数据信息。
随着网络服务的发展,JSON也正在被越来越多的程序语言所支持,序列化和反序列化技术可以实现将复杂的对象或结构转换成JSON格式的字符串,以便于在不同的程序中相互传输或存储,本文将主要介绍JSON序列化和反序列化方法。
1、JSON序列化JSON序列化是指将复杂的对象或结构转换成JSON格式的字符串,以便于在不同的程序中相互传输或存储,常用的序列化方法有以下几种:(1)JSON.stringifyJSON.stringify是JSON对象的一个静态方法,其作用是将JavaScript的值(对象或数组)转换为JSON格式的字符串,其语法为:JSON.stringify(value[, replacer[, space]])其中,value为要转换的值,replacer为选填参数,space为选填参数。
例如,将一个JavaScript对象转换为JSON格式的字符串,可以使用JSON.stringify方法:var obj = { na John age: 20 };var str = JSON.stringify(obj);console.log(str); // {ameJohnage20}(2)jQuery.stringifyjQuery.stringify()也是一种序列化对象或数组的方法,其语法与JSON.stringify()大致相同:jQuery.stringify(obj[, replacer[, space]])不同的是,jQuery.stringify()可以将任意类型的JavaScript 对象转换成JSON格式字符串,而JSON.stringify()仅在转换对象或数组时有效。
json相关注解和序列化与反序列化

json相关注解和序列化与反序列化使⽤jackson进⾏序列化时,往往会遇到后台某个实体对象的属性为null,当序列化成json时对应的属性也为null,可以⽤以下的注解⽅式完成当属性为null时不参与序列化:@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)@JsonIgnoreProperties类注解,作⽤是json序列化时将bean中的⼀些属性忽略掉,序列化和反序列化都受影响。
@JsonIgnore作⽤于属性或字段上,当⽣成json时忽略有该annotation的⽅法或字段。
@JsonProperty("rename")作⽤于属性或字段上,对其重命名。
@JsonFormat作⽤于属性或字段上,⽅便把Date类型直接转化为我们想要的模式,如@JsonFormat(pattern="yyyy-MM-dd HH-mm-ss")@JsonSerialize作⽤于属性或字段上,指定序列化⽅式。
例如:@JsonSerialize(as=BasicType.class)将类型序列化成指定类型;@JsonSerialize(using=CustomDoubleSerialize.class)⽤于在序列化时嵌⼊我们⾃定义的代码,⽐如序列化⼀个double时在其后限制两位⼩数。
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)//保证序列化json的时候,如果是null的对象,key也会消失//⽐如在创建失败的时候,只需要将status和msg显⽰出来,但是如果不加上⾯的注解会将data也显⽰出来,其值会显⽰null@JsonDeserialize作⽤于属性或字段上,指定反序列化⽅式。
例如:@JsonDeserialize(as=ValueImpl.class)将类型反序列化成指定类型;@JsonDeserialize(using=CustomDateDeserialize.class)⽤于在反序列化时嵌⼊我们⾃定义的代码。
cpp程序使用jsoncpp对json格式数据序列化和反序列化操作

cpp程序使用jsoncpp对json格式数据序列化和反序列化操作JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端之间的数据传输。
C++中有一款开源的JSON库叫做jsoncpp,它提供了便捷的接口来进行JSON数据的序列化和反序列化操作。
JSON的序列化是指将C++对象的数据转换为JSON格式的字符串,而JSON的反序列化是指将JSON格式的字符串转换为C++对象。
下面是一个使用jsoncpp进行序列化和反序列化的示例代码:```cpp#include <iostream>#include <json/json.h>int mai// 创建一个Json::Value对象,表示一个JSON数据Json::Value jsonData;//设置JSON数据的字段和值jsonData["name"] = "John";jsonData["age"] = 25;jsonData["gender"] = "male";// 将Json::Value对象序列化为JSON格式的字符串Json::StreamWriterBuilder writerBuilder;std::string jsonString = Json::writeString(writerBuilder, jsonData);std::cout << "Serialized JSON: " << jsonString << std::endl;// 反序列化JSON字符串为Json::Value对象Json::CharReaderBuilder readerBuilder;Json::Value parsedData;std::string errorMessage;// 使用jsoncpp的Json::parseFromStream函数解析JSON字符串std::istringstream jsonStream(jsonString);if (!Json::parseFromStream(readerBuilder, jsonStream,&parsedData, &errorMessage))std::cout << "Failed to parse JSON string: " << errorMessage << std::endl;return 1;}// 从Json::Value对象中获取字段的值std::string name = parsedData["name"].asString(;int age = parsedData["age"].asInt(;std::string gender = parsedData["gender"].asString(;//输出反序列化后的数据std::cout << "Deserialized JSON: " << std::endl;std::cout << "Name: " << name << std::endl;std::cout << "Age: " << age << std::endl;std::cout << "Gender: " << gender << std::endl;return 0;```在上面的示例代码中,首先创建一个Json::Value对象(jsonData),并通过使用[]运算符为其添加字段和值。
Json序列化和反序列化方法解析

Json序列化和反序列化⽅法解析复制代码代码如下:/// <summary>/// Json序列化,⽤于发送到客户端/// </summary>public static string ToJsJson(this object item){DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType()); using (MemoryStream ms = new MemoryStream()){serializer.WriteObject(ms, item);StringBuilder sb = new StringBuilder();sb.Append(Encoding.UTF8.GetString(ms.ToArray()));return sb.ToString();}}/// <summary>/// Json反序列化,⽤于接收客户端Json后⽣成对应的对象/// </summary>public static T FromJsonTo<T>(this string jsonString){DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));T jsonObject = (T)ser.ReadObject(ms);ms.Close();return jsonObject;}实体类复制代码代码如下:[DataContract]public class TestObj{[DataMember]public string make { get; set; }[DataMember]public string model { get; set; }[DataMember]public int year { get; set; }[DataMember]public string color { get; set; }}------------------javascript获取Json--------------------javascript调⽤测试代码复制代码代码如下:$('#getJson').click(function() {$.ajax({url: "getJsonHandler.ashx",type: 'GET',data: {},dataType: 'json',timeout: 1000,error: function(XMLHttpRequest, textStatus, errorThrown) { alert(textStatus) },success: function(result) {alert(result.make);alert(result.model);alert(result.year);alert(result.color);}});});C#后台⽣成代码复制代码代码如下:public class getJsonHandler: IHttpHandler{public void ProcessRequest(HttpContext context){TestObj obj = new TestObj();obj.make = "Make is Value";obj.model = "Model is Value";obj.year = 999;obj.color = "Color is Value";context.Response.Write(obj.ToJsJson());}public bool IsReusable{get{return false;}}}//返回值为 {"color":"Color is Value","make":"Make is Value","model":"Model is Value","year":999}-----------------C#由Json⽣成对象-----------------------javascript调⽤测试代码复制代码代码如下:$('#postJson').click(function() {var m_obj = { make: "Dodge", model: "Coronet R/T", year: 1968, color: "yellow" };var jsonStr = JSON.stringify(m_obj); //⽤Json2.js⽣成Json字符串$.ajax({url: "postJsonHandler.ashx",type: 'POST',data: { postjson: jsonStr },dataType: 'json',timeout: 1000,error: function(XMLHttpRequest, textStatus, errorThrown) { alert(textStatus) },success: function(result) {alert(result.success);}});});C#后台⽣成代码复制代码代码如下:public class postJsonHandler: IHttpHandler{public void ProcessRequest(HttpContext context){string jsonStr = context.Request["postjson"];TestObj obj = jsonStr.FromJsonTo<TestObj>();if (string.IsNullOrEmpty(obj.make) || string.IsNullOrEmpty(obj.model) || string.IsNullOrEmpty(obj.color)|| obj.year < 0){context.Response.Write("{success:false}");}else{context.Response.Write("{success:true}");}public bool IsReusable{get{return false;}}}使⽤Json时需要注意,服务器端拼凑⽣成Json字符串时,⼀定要注意把字符串⽤\"\"包裹,不然客户端接收时肯定会报错,根据Json 字符串⽣成对象,是根据对应的名称赋值,多于或少于都不会报错.。
json 序列化和反序列化理解

json 序列化和反序列化理解JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于阅读和编写,同时也易于机器解析和生成。
在编程中,我们常常需要将对象(如Java对象、Python对象等)转换为JSON格式,或者将JSON格式的数据转换回对象。
这个过程被称为序列化和反序列化。
1. JSON 序列化:序列化是指将对象转换为JSON 格式的过程。
在这个过程中,对象的数据被转换为一个字符串,这个字符串遵循JSON 的语法规则。
例子(Python):```pythonimport json# 定义一个Python字典对象data = {"name": "John","age": 30,"city": "New York"}# 使用json.dumps进行序列化json_data = json.dumps(data)print(json_data)# 输出: {"name": "John", "age": 30, "city": "New York"}```在这个例子中,`json.dumps` 方法将Python 字典对象`data` 序列化为一个JSON 字符串。
2. JSON 反序列化:反序列化是指将JSON 格式的字符串转换回对象的过程。
在这个过程中,JSON 字符串被解析,并且对象的数据结构被还原。
例子(Python):```pythonimport json# 定义一个JSON格式的字符串json_data = '{"name": "John", "age": 30, "city": "New York"}'# 使用json.loads进行反序列化data = json.loads(json_data)print(data)# 输出: {'name': 'John', 'age': 30, 'city': 'New York'}```在这个例子中,`json.loads` 方法将JSON 字符串`json_data` 反序列化为一个Python 字典对象。
Python中的序列化和反序列化技巧

Python中的序列化和反序列化技巧序列化是将对象转化为可存储或传输的形式,反序列化则是将序列化后的对象恢复为原始形式的过程。
在Python中,序列化和反序列化是非常常见的操作,本文将介绍一些Python中序列化和反序列化的技巧。
一、JSON序列化和反序列化JSON是一种轻量级的数据交换格式,广泛应用于前后端数据传输。
Python中的json模块提供了序列化和反序列化的功能,非常方便易用。
1. 序列化为JSON使用json.dumps()函数可以将Python对象序列化为JSON字符串。
例如,将一个字典对象序列化为JSON字符串的示例代码如下:```pythonimport jsondata = {'name': 'Alice', 'age': 20}json_str = json.dumps(data)print(json_str)```输出结果为:{"name": "Alice", "age": 20}2. 反序列化为Python对象使用json.loads()函数可以将JSON字符串反序列化为Python对象。
例如,将一个JSON字符串反序列化为字典对象的示例代码如下:```pythonjson_str = '{"name": "Alice", "age": 20}'data = json.loads(json_str)print(data)```输出结果为:{'name': 'Alice', 'age': 20}二、pickle序列化和反序列化pickle是Python中的一种序列化和反序列化模块,可以将Python对象序列化为字节流,也可以将字节流反序列化为Python对象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用json-lib完成json的序列化和反序列化2011-07-29 14:07:43分类:默认分类 | 标签:软件 java json.json的序列化和反序列化在现在的javaweb中特别是ajax中使用的比较频繁,现在本人就这种技术提出自己的使用心得。
我的pojo对象的结构是这样的部门表和员工表 1对多的关系部门对象public class Dept implements java.io.Serializable {private Integer depid;//部门IDprivate String depname;//部门名称private Set emps = new HashSet(0);//员工集合}员工对象public class Emp implements java.io.Serializable {private Integer empid;//员工idprivate Dept dept;//部门private String empname;//员工名称private Date birthday;//生日}1.json字符串序列化成对象/***通过json转换成对象*@author凤生禾予*/public void jsonToObject(){Date d=new Date();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");StringBuffer str=new StringBuffer();// json字符串str.append("{empid:1,dept:{depid:1,depname:'开发部'},empname:'张三',birthday:'"+sdf.format(d)+"'}");// 使用JSONObject将json序列化对象JSONObject obj=JSONObject.fromObject(str.toString());// 将JOSNObject对象转换成pojo对象Emp emp=(Emp) JSONObject.toBean(obj,Emp.class);System.out.println(emp.getBirthday());}这里需要注意的是json字符串的写法以{}表示一个对象,字符串必须加引号2json字符串序列化成集合/***通过json转换成集合*@author凤生禾予*/public void jsonToArray(){Date d=new Date();SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");StringBuffer str=new StringBuffer();//json字符串str.append("[");str.append("{empid:1,dept:{depid:1,depname:'开发部'},empname:'张三',birthday:'"+sdf.format(d)+"'}");str.append(",");str.append("{empid:2,dept:{depid:1,depname:'开发部'},empname:'李四',birthday:'"+sdf.format(d)+"'}");str.append("]");//将json转换成JSONArray对象JSONArray arr=JSONArray.fromObject(str.toString());//使用JSONArray转换成集合List<Emp> list=JSONArray.toList(arr,Emp.class);for (Emp emp : list) {System.out.println(emp.getEmpname());System.out.println(emp.getBirthday());System.out.println(emp.getDept().getDepname());}}这里需要注意的是json的数组用法为[]3.对象反序列化成json/***通过对象转换成json*@author凤生禾予*/public void objectToJson(){ClassPathXmlApplicationContext xa=newClassPathXmlApplicationContext("applicationContext.xml");EmpDAO dao=(EmpDAO) xa.getBean("EmpDAO");//查找对象Emp emp=dao.findById(27);String s=JSONObject.fromObject(emp).toString();System.out.println(s);}这里会有2个问题1.pojo中对象存在有死循环问题,部门类中有员工对象的集合,员工类中有部门的对象,json-lib 反序列化中会进行双向转换,从而形成死循环,会报一个json-lib的经典异常:Exception in thread "main" net.sf.json.JSONException: There is a cycle in the hierarchy!2.日期类型转换json-lib转换出来的日期类型格式"birthday":{"date":1,"day":0,"hours":0,"minutes":0,"month":7,"nanos":0, "seconds":0,"time":1280592000000,"timezoneOffset":-480,"year":110}那么我们如果想要yyyy-MM-dd HH:mm:ss 这种格式的怎么办呢?那么解决方案有3个都必须使用jsonConfig对象进行处理(1)使用jsonConfig的setExcludes的方法进行过滤,将所需要过滤的字段名传入setExcludes方法public void objectToJson(){ClassPathXmlApplicationContext xa=newClassPathXmlApplicationContext("applicationContext.xml");EmpDAO dao=(EmpDAO) xa.getBean("EmpDAO");//查找对象Emp emp=dao.findById(27);//创建jsonConfig对象JsonConfig config=new JsonConfig();//设置过滤字段config.setExcludes(new String[]{"dept"});String s=JSONObject.fromObject(emp,config).toString();System.out.println(s);}(2)使用jsonConfig的setJsonPropertyFilter进行属性过滤,过滤器中返回true表示过滤该字段,返回false表示可以转换该字段public void objectToJson(){ClassPathXmlApplicationContext xa=newClassPathXmlApplicationContext("applicationContext.xml");EmpDAO dao=(EmpDAO) xa.getBean("EmpDAO");//查找对象Emp emp=dao.findById(27);//创建jsonConfig对象JsonConfig config=new JsonConfig();//设置过滤字段config.setJsonPropertyFilter(new PropertyFilter() {public boolean apply(Object arg0, String arg1, Object arg2) { if("dept".equals(arg1)){return true;}return false;}});String s=JSONObject.fromObject(emp,config).toString();System.out.println(s);}上述两种解决方案可以解决部分问题,但是json-lib使用代理进行反射,所以如果想要部门表的信息,而去过滤部门表的员工对象,这样还是解决不了。
这样可以使用更简单有效的方案(3)使用jsonConfig的setCycleDetectionStrategy()方法进行忽略死循环使用jsonConfig的registerJsonValueProcessor()进行属性转换设置/***通过对象转换成json*@author凤生禾予*/public void objectToJson(){ClassPathXmlApplicationContext xa=newClassPathXmlApplicationContext("applicationContext.xml");EmpDAO dao=(EmpDAO) xa.getBean("EmpDAO");//查找对象Emp emp=dao.findById(27);//创建jsonConfig对象JsonConfig config=new JsonConfig();//设置循环策略为忽略解决json最头疼的问题死循环config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);//设置 json转换的处理器用来处理日期类型//凡是反序列化Date类型的对象,都会经过该处理器进行处理config.registerJsonValueProcessor(Date.class, new JsonValueProcessor() {//参数1 :属性名参数2:json对象的值参数3:jsonConfig对象public Object processObjectValue(String arg0, Object arg1, JsonConfig arg2) {SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");Date d=(Date) arg1;return sdf.format(d);}public Object processArrayValue(Object arg0, JsonConfig arg1) { return null;}});String s=JSONObject.fromObject(emp,config).toString();System.out.println(s);}这种方案可以解决死循环问题和日期格式化的问题。