C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例

我就废话不多说啦,大家还是直接看代码吧~

[
 {
  "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": "山东特产山东大枣1000g",
    "manmoney": "200",
    "jianmoney": "0",
    "jianyoufei": "10"
   }
  ]
 }
]

上面为要解析的JSON数据

 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;//判断是否同一个商家
    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 + "实际付款金额:" + data.actualPayment;
     }
     else if (!string.IsNullOrEmpty(data.fullCut.ToString()) && data.fullCut != 0)
     {
      getinfo.Remark = "此商品符合满" + item.manmoney + "减" + data.fullCut + "条件:订单总金额:" + data.originalCost + "符合满减条件减去:" + data.fullCut + "实际付款金额:" + data.actualPayment;
     }
     else
     {
      getinfo.Remark = "订单实际付款金额:" + 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; }

 }

效果图:

补充:c#使用 Newtonsoft.Json 实现多态序列化

有时候会碰到以下情况

1.定义了一个类型为A的字段,但在实例化时使用的是它的派生类B。

2.定义了一个存储基类型A的集合,但实际上里面包含了各种各样的派生类。

上述两种情况在序列化的时候没有问题,但在反序列化的时候程序并不能将其转化为成派生类。

Newtonsoft.Json提供了一个JsonConverter特性,我们可以自定义某个数据的json读写方式以达成多态序列化的目的。

源码链接

1.自定义转化类

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using UnityEngine;
namespace XFramework.JsonConvter
{
 /// <summary>
 /// 用于多态列表的转化
 /// </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>
 /// 用于多态序列化
 /// </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是自己定义的一个数据基类,按照以下写法,再利用Newtonsoft 的API 序列化和反序列化TestData就可以成功实现多态读写了。

using XFramework.JsonConvter;
using Newtonsoft.Json;
public class TestData
{
 // 对应第一种情况
 [JsonConverter(typeof(PolyConverter))]
 public DataBase datas;

 // 对应第二种情况
 [JsonConverter(typeof(PolyListConverter<DataBase>))]
 public List<EquipPowerBase> powerList;
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • c#添加Newtonsoft.Json包的操作

    C#使用json 点击工具 - NuGet包管理器 - 程序包管理控制台,输入下面命令: Install-Package Newtonsoft.Json 即可使用Newtonsoft.Json 包进行json操作 PM> Install-Package Newtonsoft.Json 正在尝试收集与目标为".NETFramework,Version=v4.0"的项目"QiniuTests"有关的包"Newtonsoft.Json.11.0.2&quo

  • C#使用Json.Net进行序列化和反序列化及定制化

    序列化(Serialize)是将对象转换成字节流,并将其用于存储或传输的过程,主要用途是保存对象的状态,以便在需要时重新创建该对象:反序列化(Deserialize)则是将上面的字节流转换为相应对象的过程:在.Net阵营中,Json.Net是由官方推荐的高性能开源序列化/反序列化工具,其官方网站:https://www.newtonsoft.com/json: 一.将对象序列化为Json格式字符串 首先是正常的序列化操作,对于给定的类: private class MyClass { publi

  • vs 中C#项目读取JSON配置文件的方法

    config.json 文件内容如下 { "Data": { "DefaultConnection": { "ConnectionString": "Server=(localdb)\\MSSQLLocalDB;Database=Books;Trusted_Connection=True;" } }, "Appsettings": { "Name": "XiaoLi"

  • c# 如何实现一个简单的json解析器

    一.JSON格式介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着很多优点.例如易读性更好,占用空间更少等.在 web 应用开发领域内,得益于 JavaScript 对 JSON 提供的良好支持,JSON 要比 XML 更受开发人员青睐.所以作为开发人员,如果有兴趣的话,还是应该深入了解一下 JSON 相关的知识.本着探究 JSON 原理的目的,我将会在这篇文章中详细向大家介绍一个简单的JSON解析

  • C#实现Json转DataTable并导出Excel的方法示例

    本文实例讲述了C#实现Json转DataTable并导出Excel的方法.分享给大家供大家参考,具体如下: 需求:有一个log文件,需要整理成Excel,日志文件里面的数据都是json字符串 思路是,把Json字符串转换成DataTable,然后导出到Excel 在网上找了一些资料,整理了以下三种类型的Json 一.Json转换DataTable 1.处理简单Json: [{"mac":"20:f1:7c:c5:cd:80","rssi":&qu

  • C# Newtonsoft.Json 的使用说明

    我就废话不多说啦,大家还是直接看代码吧~ byte[] bUserInfoSearch = new byte[1024 * 10]; //10kb大小 Marshal.Copy(lpBuffer, bUserInfoSearch, 0, bUserInfoSearch.Length); string strUserInfoSearch = System.Text.Encoding.UTF8.GetString(bUserInfoSearch); CUserInfoSearch m_JsonUse

  • C#网络请求与JSON解析的示例代码

    最新学校的海康摄像头集控平台(网页端)不能在win10里登录,我寻思着拿海康的c# demo直接改. 首先得解决权限问题,每个教师任教不同年级,只能看到自己所在年级的设备,涉及到登录,在此记录一下C#中网络请求和数据处理的一些内容.大致流程为: 客户端发起登录请求: 服务端验证账号密码 返回json字符串,包含用户信息.平台配置等信息 客户端解析并初始化 一.发起GET请求 private string HttpGet(string api) { string serviceAddress =

  • C# Newtonsoft.Json 解析多嵌套json 进行反序列化的实例

    我就废话不多说啦,大家还是直接看代码吧~ [ { "orderNo": "3213123123123", "time": "2016-09-09 12:23:33", "orderStatus": "1", "freeShipping": true, "fullCut": 20, "originalCost": 340, &qu

  • java解析多层嵌套json字符串问题

    目录 java分别解析下面两个json字符串 嵌套(任意层)JSON解析转换为Map 源代码 java分别解析下面两个json字符串 package jansonDemo; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; public class TestJSON { /** * JSON实际上也是键值对("key&qu

  • 使用Jackson-json解析一个嵌套的json字符串

    目录 Jackson-json解析一个嵌套的json字符串 关于这个jar包 然后读入我的json字符串(str) 把节点展开 取到shops时就简单了,贴上代码 java解析多层嵌套json字符串 Jackson-json解析一个嵌套的json字符串 最近想尝试一下java的爬虫的编写,于是不可避免的遇到了要处理json数据的问题,于是乎用到了Jackson-json这个jar包 关于这个jar包 先在工程中导入这个jar包,然后创建一个ObjectMapper对象 ObjectMapper

  • Java 多层嵌套JSON类型数据全面解析

    目录 多层嵌套JSON类型数据解析 以下举例数据结构 解析代码 json解析多层嵌套并转为对应类(List) Json(随便扒的格式,将就看~) 关键依赖 JAVABEAN转JSONObject 多层嵌套JSON类型数据解析 简单来说: “key”:“value” --> 此时value为String“key":0 --> 此时value为int“key”:{“k1”:“v1”} --> 此时value为JSONObject“key”:[v] --> 此时value为JS

  • 详解ASP.NET提取多层嵌套json数据的方法

    本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":"lily","age":23,"addr":{"city":guangzhou,"province":guangdong}} 先引用命名空间: using Newtonsoft.Json; using Newtons

  • iOS json解析出错的几种情况总结

    iOS json解析出错 对于json格式,我们并不陌生,但是因为它处于不同的语言标准也不一致.分享一下最近项目出现的json问题: 1.编码问题,在不清楚服务端的编码格式的情况下,我直接使用: NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]; NSError *error = nil; NSArray *arr = [NSJSONSerialization JSONObjectWithD

  • Golang 如何解析和生成json

    JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读.尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯.JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是.JSON由于比XML更小.更快,更易解析,以及浏览器的內建快速解析支持,使得其更适用于网络数据传输领域. Golang自带的JSON解析库encoding/json,可以用

  • newtonsoft.json解析天气数据出错解决方法

    今天用NewtonSoft.JSon解析一个天气数据,数据格式如: 复制代码 代码如下: {"status":1,"detail":"\u6570\u636e\u83b7\u53d6\u6210\u529f","data":[[{"date":"2014-01-01","dis_id":"1119","dis_name":&qu

  • Django后端接收嵌套Json数据及解析详解

    0.干货先写在前 1.前端传值的数据必须使用JSON.stringify()传化 2.后端,通过request.body接收数据,直接使用json.loads解析,解析前,先decode一下:receive_data = json.loads(request.body.decode()).如果使用simplejson.loads(request.body),就不用decode() 下面是这个问题产生及解决的过程,还有一些可能的应用场景. 1.传统方式解析表单数据 之前用Django后台接收数据的

  • asp.net提取多层嵌套json数据的方法

    本文实例讲述了asp.net提取多层嵌套json数据的方法.分享给大家供大家参考,具体如下: 在.net 2.0中提取这样的json: 复制代码 代码如下: {"name":"lily","age":23,"addr":{"city":guangzhou,"province":guangdong}} 引用命名空间: using Newtonsoft.Json; using Newtons

随机推荐