最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# Newtonsoft.Json 解析多嵌套json 進(jìn)行反序列化的實(shí)例

 更新時(shí)間:2021年01月14日 09:27:55   作者:蝶戀花雨  
這篇文章主要介紹了C# Newtonsoft.Json 解析多嵌套json 進(jìn)行反序列化的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

我就廢話不多說(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ò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • C#解決引用類(lèi)型的深度克隆問(wèn)題

    C#解決引用類(lèi)型的深度克隆問(wèn)題

    本文將給大家介紹如何讓引用類(lèi)型的對(duì)象復(fù)制以后各自擁有獨(dú)立的內(nèi)存從而實(shí)現(xiàn)一個(gè)對(duì)象值的變化不會(huì)影響別的對(duì)象,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-08-08
  • C#正則檢測(cè)字符串是否字母數(shù)字混編的方法

    C#正則檢測(cè)字符串是否字母數(shù)字混編的方法

    這篇文章主要介紹了C#正則檢測(cè)字符串是否字母數(shù)字混編的方法,涉及C#正則判定字符串的使用技巧,需要的朋友可以參考下
    2015-06-06
  • C#用戶(hù)定義類(lèi)型轉(zhuǎn)換詳解

    C#用戶(hù)定義類(lèi)型轉(zhuǎn)換詳解

    用于自定義類(lèi)和結(jié)構(gòu)能夠進(jìn)行隱式轉(zhuǎn)換和顯示轉(zhuǎn)換.例如:將一個(gè)自定義類(lèi)類(lèi)型轉(zhuǎn)換成整型,浮點(diǎn)型等,反之亦然
    2014-01-01
  • C#實(shí)現(xiàn)基于ffmpeg加虹軟的人臉識(shí)別的示例

    C#實(shí)現(xiàn)基于ffmpeg加虹軟的人臉識(shí)別的示例

    本篇文章主要介紹了C#實(shí)現(xiàn)基于ffmpeg加虹軟的人臉識(shí)別的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • C#中設(shè)置textbox限制條件的方法

    C#中設(shè)置textbox限制條件的方法

    這篇文章主要介紹了C#中設(shè)置textbox限制條件的方法,可實(shí)現(xiàn)設(shè)置像數(shù)量、價(jià)格、金額等的textbox的限制條件,用戶(hù)只能輸入數(shù)字或小數(shù),是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12
  • c# 多線程處理多個(gè)數(shù)據(jù)的方法

    c# 多線程處理多個(gè)數(shù)據(jù)的方法

    這篇文章主要介紹了c# 多線程處理多個(gè)數(shù)據(jù)的方法,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • 利用WPF實(shí)現(xiàn)系統(tǒng)資源監(jiān)控的完整代碼

    利用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ì)列形式)

    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
  • C#使用文件流讀取文件的方法

    C#使用文件流讀取文件的方法

    這篇文章主要介紹了C#使用文件流讀取文件的方法,涉及C#中FileInfo類(lèi)操作文件的技巧,需要的朋友可以參考下
    2015-04-04
  • LINQ基礎(chǔ)之Join和UNION子句

    LINQ基礎(chǔ)之Join和UNION子句

    這篇文章介紹了LINQ使用Join和UNION子句的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04

最新評(píng)論

陈巴尔虎旗| 渭源县| 土默特右旗| 文成县| 云梦县| 民勤县| 岳普湖县| 中卫市| 长岭县| 庆云县| 甘谷县| 兰坪| 长子县| 大同市| 襄垣县| 岳普湖县| 社会| 南华县| 江达县| 两当县| 海口市| 当涂县| 五原县| 山阳县| 彰化市| 沙洋县| 龙口市| 巴林右旗| 惠州市| 齐齐哈尔市| 河南省| 靖西县| 巴林左旗| 襄汾县| 安乡县| 陈巴尔虎旗| 天峨县| 阿勒泰市| 宣汉县| 东城区| 崇明县|