C# Newtonsoft.Json 解析多嵌套json 進(jìn)行反序列化的實(shí)例
我就廢話不多說(shuō)啦,大家還是直接看代碼吧~
[
{
"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 = "此商品符合包郵條件及滿(mǎn)" + item.manmoney + "減" + data.fullCut + "條件:訂單總金額:" + data.originalCost + "符合滿(mǎn)減條件減去:" + data.fullCut + "實(shí)際付款金額:" + data.actualPayment;
}
else if (!string.IsNullOrEmpty(data.fullCut.ToString()) && data.fullCut != 0)
{
getinfo.Remark = "此商品符合滿(mǎn)" + item.manmoney + "減" + data.fullCut + "條件:訂單總金額:" + data.originalCost + "符合滿(mǎn)減條件減去:" + 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);
}
}
要用的對(duì)象類(lèi)
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è)類(lèi)型為A的字段,但在實(shí)例化時(shí)使用的是它的派生類(lèi)B。
2.定義了一個(gè)存儲(chǔ)基類(lèi)型A的集合,但實(shí)際上里面包含了各種各樣的派生類(lèi)。
上述兩種情況在序列化的時(shí)候沒(méi)有問(wèn)題,但在反序列化的時(shí)候程序并不能將其轉(zhuǎn)化為成派生類(lèi)。
Newtonsoft.Json提供了一個(gè)JsonConverter特性,我們可以自定義某個(gè)數(shù)據(jù)的json讀寫(xiě)方式以達(dá)成多態(tài)序列化的目的。
1.自定義轉(zhuǎn)化類(lèi)
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ù)基類(lèi),按照以下寫(xiě)法,再利用Newtonsoft 的API 序列化和反序列化TestData就可以成功實(shí)現(xiàn)多態(tài)讀寫(xiě)了。
using XFramework.JsonConvter;
using Newtonsoft.Json;
public class TestData
{
// 對(duì)應(yīng)第一種情況
[JsonConverter(typeof(PolyConverter))]
public DataBase datas;
// 對(duì)應(yīng)第二種情況
[JsonConverter(typeof(PolyListConverter<DataBase>))]
public List<EquipPowerBase> powerList;
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- C#下Newtonsoft.Json的具體使用
- C# Newtonsoft.Json庫(kù)的常用屬性和方法詳解
- C#使用Newtonsoft.Json庫(kù)實(shí)現(xiàn)JSON數(shù)據(jù)中某個(gè)字段值的提取功能
- C# Newtonsoft.Json用法詳解
- C#使用Newtonsoft.Json中的JObject對(duì)象
- C# newtonsoft.json中文亂碼問(wèn)號(hào)的解決方案
- c# Newtonsoft.Json 常用方法總結(jié)
- c#添加Newtonsoft.Json包的操作
- C# Newtonsoft.Json 的使用說(shuō)明
- C#中Newtonsoft.Json 到 System.Text.Json 遷移避坑指南
相關(guān)文章
C#實(shí)現(xiàn)基于ffmpeg加虹軟的人臉識(shí)別的示例
本篇文章主要介紹了C#實(shí)現(xiàn)基于ffmpeg加虹軟的人臉識(shí)別的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
利用WPF實(shí)現(xiàn)系統(tǒng)資源監(jiān)控的完整代碼
在現(xiàn)代軟件開(kāi)發(fā)中,系統(tǒng)資源監(jiān)控是系統(tǒng)管理、性能分析和故障診斷的重要工具,WPF是構(gòu)建現(xiàn)代化、美觀實(shí)用的系統(tǒng)監(jiān)控應(yīng)用的理想選擇,本文將詳細(xì)介紹如何使用WPF創(chuàng)建一個(gè)功能全面的系統(tǒng)資源監(jiān)控儀表盤(pán),需要的朋友可以參考下2026-01-01
winform開(kāi)發(fā)使用通用多線程基類(lèi)分享(以隊(duì)列形式)
多線程這個(gè)概念大家都很熟悉,對(duì)于winform的開(kāi)發(fā)人員來(lái)說(shuō),用的還是多的.但估計(jì)都是用Timer,或者backgroundWorker,為大家寫(xiě)了一個(gè)多線程的基類(lèi),只有你用到多線程拿過(guò)來(lái)就可以用了2013-12-12

