C# Newtonsoft.Json 解析多嵌套json 進(jìn)行反序列化的實(shí)例
我就廢話不多說啦,大家還是直接看代碼吧~
[ { "orderNo": "3213123123123", "time": "2016-09-09 12:23:33", "orderStatus": "1", "freeShipping": true, "fullCut": 20, "originalCost": 340, "actualPayment": 320, "goods": [ { "UserId": "5", "GoodsId": "8", "Total": 40, "Number": 2, "ConCcoin": 0, "PayMode": "支付寶", "Price": "20.00", "goodsImg": "UpLoadImg/GoodsImage/546fda6d-8417-4b8f-bac6-3084dca420a9.jpg", "shopname": "兩顆牙", "goodsTitle": "周村燒餅", "manmoney": "200", "jianmoney": "20", "jianyoufei": "8" }, { "UserId": "5", "GoodsId": "7", "Total": 60, "Number": 1, "ConCcoin": 0, "PayMode": "支付寶", "Price": "60.00", "goodsImg": "UpLoadImg/GoodsImage/931be419-e9d3-4dae-ae93-5af619c217d9.jpg", "shopname": "兩顆牙", "goodsTitle": "山東特產(chǎn)山東大棗1000g", "manmoney": "200", "jianmoney": "0", "jianyoufei": "10" } ] } ]
上面為要解析的JSON數(shù)據(jù)
var json = "[{\"orderNo\": \"3213123123123\",\"time\": \"2016-09-09 12:23:33\",\"orderStatus\":\"1\", \"freeShipping\": true, \"fullCut\": 20,\"originalCost\": 340, \"actualPayment\": 320,\"goods\": ["; json += " {\"UserId\": \"5\",\"GoodsId\": \"8\", \"Total\": 40, \"Number\": 2, \"Price\": \"20.00\", \"shopname\": \"兩顆牙\", \"manmoney\": \"200\", \"jianmoney\": \"0\",\"jianyoufei\": \"10\"},"; json += " {\"UserId\": \"5\",\"GoodsId\": \"7\", \"Total\": 60, \"Number\": 1, \"Price\": \"60.00\",\"shopname\": \"兩顆牙\", \"manmoney\": \"200\", \"jianmoney\": \"0\",\"jianyoufei\": \"10\"},"; json += " ]} ]"; OrderDetails[] datas = JsonConvert.DeserializeObject<OrderDetails[]>(json); List<OrderDetailsInsert> insert = new List<OrderDetailsInsert>(); foreach (OrderDetails data in datas) { var shopname = string.Empty;//判斷是否同一個(gè)商家 foreach (var item in data.goods) { OrderDetailsInsert getinfo = new OrderDetailsInsert(); getinfo.orderno = data.orderno; getinfo.time = data.time; getinfo.orderStatus = data.orderStatus; getinfo.actualPayment = data.actualPayment; getinfo.orderno = data.orderno; if (data.freeShipping == true) { getinfo.Remark = "此商品符合包郵條件及滿" + item.manmoney + "減" + data.fullCut + "條件:訂單總金額:" + data.originalCost + "符合滿減條件減去:" + data.fullCut + "實(shí)際付款金額:" + data.actualPayment; } else if (!string.IsNullOrEmpty(data.fullCut.ToString()) && data.fullCut != 0) { getinfo.Remark = "此商品符合滿" + item.manmoney + "減" + data.fullCut + "條件:訂單總金額:" + data.originalCost + "符合滿減條件減去:" + data.fullCut + "實(shí)際付款金額:" + data.actualPayment; } else { getinfo.Remark = "訂單實(shí)際付款金額:" + data.actualPayment; } getinfo.GoodsId = item.GoodsId; getinfo.Total = item.Total; getinfo.Number = item.Number; getinfo.Price = item.Price; insert.Add(getinfo); } }
要用的對象類
public class OrderDetailsInsert { public string orderno { get; set; } public DateTime time { get; set; } public char orderStatus { get; set; } public Decimal actualPayment { get; set; } public int GoodsId { get; set; } public string Total { get; set; } public int Number { get; set; } public string Price { get; set; } public string Remark { get; set; } } public class OrderDetails { public string orderno { get; set; } public DateTime time { get; set; } public char orderStatus { get; set; } public bool freeShipping { get; set; } public Decimal fullCut { get; set; } public Decimal originalCost { get; set; } public Decimal actualPayment { get; set; } public GoodsInfoList[] goods { get; set; } } public class GoodsInfoList { public int UserId { get; set; } public int GoodsId { get; set; } public string Total { get; set; } public int Number { get; set; } public string Price { get; set; } public string shopname { get; set; } public string manmoney { get; set; } }
效果圖:
補(bǔ)充:c#使用 Newtonsoft.Json 實(shí)現(xiàn)多態(tài)序列化
有時(shí)候會(huì)碰到以下情況
1.定義了一個(gè)類型為A的字段,但在實(shí)例化時(shí)使用的是它的派生類B。
2.定義了一個(gè)存儲(chǔ)基類型A的集合,但實(shí)際上里面包含了各種各樣的派生類。
上述兩種情況在序列化的時(shí)候沒有問題,但在反序列化的時(shí)候程序并不能將其轉(zhuǎn)化為成派生類。
Newtonsoft.Json提供了一個(gè)JsonConverter特性,我們可以自定義某個(gè)數(shù)據(jù)的json讀寫方式以達(dá)成多態(tài)序列化的目的。
1.自定義轉(zhuǎn)化類
using System; using System.Collections.Generic; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using UnityEngine; namespace XFramework.JsonConvter { /// <summary> /// 用于多態(tài)列表的轉(zhuǎn)化 /// </summary> /// <typeparam name="T"></typeparam> public class PolyListConverter<T> : JsonConverter { public override bool CanConvert(Type objectType) { return true; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); List<T> values = new List<T>(); foreach (var item in jObject.Properties()) { Type type = Type.GetType(item.Name); var value = item.Value.ToObject(type); values.Add((T)value); } return values; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var values = (List<T>)value; JObject jObject = new JObject(); foreach (var item in values) { jObject.Add(item.GetType().FullName, JToken.FromObject(item)); } var p = jObject.Properties(); foreach (var item in p) { Debug.Log(item.Name); } serializer.Serialize(writer, jObject); } } /// <summary> /// 用于多態(tài)序列化 /// </summary> public class PolyConverter : JsonConverter { public override bool CanConvert(Type objectType) { return true; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); foreach (var item in jObject.Properties()) { Type type = Type.GetType(item.Name); var value = item.Value.ToObject(type); return value; } return null; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { JObject jObject = new JObject(); jObject.Add(value.GetType().FullName, JToken.FromObject(value)); serializer.Serialize(writer, jObject); } } }
2.使用方式
DataBase是自己定義的一個(gè)數(shù)據(jù)基類,按照以下寫法,再利用Newtonsoft 的API 序列化和反序列化TestData就可以成功實(shí)現(xiàn)多態(tài)讀寫了。
using XFramework.JsonConvter; using Newtonsoft.Json; public class TestData { // 對應(yīng)第一種情況 [JsonConverter(typeof(PolyConverter))] public DataBase datas; // 對應(yīng)第二種情況 [JsonConverter(typeof(PolyListConverter<DataBase>))] public List<EquipPowerBase> powerList; }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- C#實(shí)現(xiàn)XML序列化與反序列化
- C#對Json進(jìn)行序列化和反序列化
- C#中關(guān)于序列化與反序列化的三種方法
- C# 解析XML和反序列化的示例
- C#中Json反序列化的實(shí)現(xiàn)方法
- C#實(shí)現(xiàn)XML與實(shí)體類之間相互轉(zhuǎn)換的方法(序列化與反序列化)
- C#序列化與反序列化(Serialize,Deserialize)實(shí)例詳解
- c#對象反序列化與對象序列化示例詳解
- C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼
- 深入理解C#序列化與反序列化的詳解
- C# SimpleJSON字典反序列化實(shí)戰(zhàn)教程
相關(guān)文章
基于WPF實(shí)現(xiàn)一個(gè)簡單的音頻播放動(dòng)畫控件
這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)一個(gè)簡單的音頻播放動(dòng)畫控件,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2022-07-07C#構(gòu)造函數(shù)在基類和父類中的執(zhí)行順序
這篇文章介紹了C#構(gòu)造函數(shù)在基類和父類中的執(zhí)行順序,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04C#/VB.NET實(shí)現(xiàn)將Html轉(zhuǎn)為Word的示例詳解
本文分享以C#程序代碼為例,實(shí)現(xiàn)將Html文件轉(zhuǎn)換Word文檔的方法(附VB.NET代碼)。在實(shí)際轉(zhuǎn)換場景中可參考本文的方法,感興趣的可以了解一下2022-07-07那些年,我還在學(xué)習(xí)C# 學(xué)習(xí)筆記
那些年學(xué)了ASP.NET后,才開始學(xué)習(xí)C#,說來也怪,怎么學(xué)了ASP.NET才來學(xué)習(xí)C#,其實(shí)沒有什么的2012-03-03C# 二進(jìn)制數(shù)組與結(jié)構(gòu)體的互轉(zhuǎn)方法
本文將和大家介紹 MemoryMarshal 輔助類,通過這個(gè)輔助類用來實(shí)現(xiàn)結(jié)構(gòu)體數(shù)組和二進(jìn)制數(shù)組的相互轉(zhuǎn)換,對C# 二進(jìn)制數(shù)組與結(jié)構(gòu)體的互轉(zhuǎn)方法感興趣的朋友一起看看吧2023-09-09