当前位置: 首页 > news >正文

【C#】复杂Json的反序列

复杂结构的JSON

如何将一个复杂类型的JSON进行反序列化。那就是如何把json拆解成一个个子类的过程。

如下我有这样一个json字符串:

{
            "success": True,
            "message": "操作成功!",
            "code": 200,
            "result": {
                "ruleColumn": [
                    {
                        "columnChName": "孔宽1"
                    },
                    {
                        "columnChName": "孔从中心偏移3"
                    },
                    {
                        "columnChName": "孔从中心偏移6"
                    },
                    {
                        "columnChName": "孔从中心偏移5"
                    },
                    {
                        "columnChName": "孔从中心偏移2"
                    },
                    {
                        "columnChName": "孔长3"
                    },
                    {
                        "columnChName": "孔从中心偏移7"
                    },
                    {
                        "columnChName": "孔从中心偏移4"
                    },
                    {
                        "columnChName": "孔中到Y中心8"
                    },
                    {
                        "columnChName": "孔中到X中心9"
                    }
                ],
                "number": 5,
                "titleColumn": [
                    {
                        "columnChName": "工序",
                        "columnType": "input",
                        "selectValue": None
                    },
                    {
                        "columnChName": "日期",
                        "columnType": "date",
                        "selectValue": None
                    },
                    {
                        "columnChName": "班次",
                        "columnType": "select",
                        "selectValue": [
                            "A",
                            "B"
                        ]
                    },
                    {
                        "columnChName": "测试时间",
                        "columnType": "input",
                        "selectValue": None
                    },
                    {
                        "columnChName": "测试员",
                        "columnType": "input",
                        "selectValue": None
                    },
                    {
                        "columnChName": "测试机台号",
                        "columnType": "input",
                        "selectValue": None
                    },
                    {
                        "columnChName": "备注",
                        "columnType": "input",
                        "selectValue": None
                    },
                    {
                        "columnChName": "生产机台",
                        "columnType": "input",
                        "selectValue": None
                    },
                    {
                        "columnChName": "检验方式",
                        "columnType": "input",
                        "selectValue": None
                    },
                    {
                        "columnChName": "判定",
                        "columnType": "judge",
                        "selectValue": None
                    }
                ],
                "projectDetailId": "1559817674652483586",
                "rules": [
                    {
                        "columnChName": "孔宽1",
                        "nominalDim": 17.28,
                        "tolMax": 0.02,
                        "tolMin": 0.02,
                        "usl": 17.3,
                        "lsl": 17.26
                    },
                    {
                        "columnChName": "孔从中心偏移3",
                        "nominalDim": 17.28,
                        "tolMax": 0.02,
                        "tolMin": 0.02,
                        "usl": 17.3,
                        "lsl": 17.26
                    },
                    {
                        "columnChName": "孔从中心偏移6",
                        "nominalDim": 17.28,
                        "tolMax": 0.02,
                        "tolMin": 0.02,
                        "usl": 17.3,
                        "lsl": 17.26
                    },
                    {
                        "columnChName": "孔从中心偏移5",
                        "nominalDim": 13.84,
                        "tolMax": 0.05,
                        "tolMin": 0.05,
                        "usl": 13.89,
                        "lsl": 13.79
                    },
                    {
                        "columnChName": "孔从中心偏移2",
                        "nominalDim": 13.84,
                        "tolMax": 0.05,
                        "tolMin": 0.05,
                        "usl": 13.89,
                        "lsl": 13.79
                    },
                    {
                        "columnChName": "孔长3",
                        "nominalDim": 52.94,
                        "tolMax": 0.02,
                        "tolMin": 0.02,
                        "usl": 52.96,
                        "lsl": 52.92
                    },
                    {
                        "columnChName": "孔从中心偏移7",
                        "nominalDim": 49.75,
                        "tolMax": 0.02,
                        "tolMin": 0.02,
                        "usl": 49.77,
                        "lsl": 49.73
                    },
                    {
                        "columnChName": "孔从中心偏移4",
                        "nominalDim": 49.75,
                        "tolMax": 0.02,
                        "tolMin": 0.02,
                        "usl": 49.77,
                        "lsl": 49.73
                    },
                    {
                        "columnChName": "孔中到Y中心8",
                        "nominalDim": 43.99,
                        "tolMax": 0.02,
                        "tolMin": 0.02,
                        "usl": 44.01,
                        "lsl": 43.97
                    },
                    {
                        "columnChName": "孔中到X中心9",
                        "nominalDim": 16.23,
                        "tolMax": 0.02,
                        "tolMin": 0.02,
                        "usl": 16.25,
                        "lsl": 16.21
                    }
                ]
            },
            "timestamp": 1663056576303
        }

其中result这个key对应的内容是可能发生变化的,所以这里可以用到泛型。大体不变的框架是这样的:

{
            "success": True,
            "message": "添加成功!",
            "code": 200,
            "result": None,
            "timestamp": int(round(time.time() * 1000))
}

类的构造

那我先构造这个类,对于大的框架:

注意,类名并不重要(他代表的是大括号)重要的是属性的名称,需要和key的值保持一致:

public class WeiDaLiResult<T>
{
    public bool success { get; set; }
    public string message { get; set; }
    public int code { get; set; }
    public T result { get; set; }
    public ulong timestamp { get; set; }
}

然后是针对当前result的部分,这里的技术关键是如何构造json数组,我们用到了IList接口:

    #region item 项
    public class RuleColumnItem
    {
        public string columnChName { get; set; }
    }

    public class TitleColumnItem
    {
        public string columnChName { get; set; }
        public string columnType { get; set; }
        public IList<string> selectValue { get; set; }
    }
    public class RulesItem
    {
        public string columnChName { get; set; }
        public float nominalDim { get; set; }
        public float tolMax { get; set; }
        public float tolMin { get; set; }
        public float usl { get; set; }
        public float lsl { get; set; }
    }
    #endregion

    public class SubResult
    {
        public IList<RuleColumnItem> ruleColumn { get; set; }
        public int number { get; set; }
        public IList<TitleColumnItem> titleColumn { get; set; }
        public string projectDetailId { get; set; }
        public IList<RulesItem> rules { get; set; }

    }

反序列化过程调用

反序列化过程调用(注意泛型是如何被使用的):

var r = System.Text.Json.JsonSerializer.Deserialize<WeiDaLiResult<SubResult>>(str_json);

枚举的反序列化

这里在做一个优化:

将columnType这个字段序列化成枚举。

[JsonConverter(typeof(JsonStringEnumConverter))]

public enum ControlType
{
    input = 0,
    date,
    select,
    judge,
}

类改造

//改造前
public class TitleColumnItem
{
    public string columnChName { get; set; }
    public string columnType { get; set; }
    public IList<string> selectValue { get; set; }
}


//改造后
public class TitleColumnItem
{
    public string columnChName { get; set; }
    public ControlType columnType { get; set; }
    public IList<string> selectValue { get; set; }
}

注意,枚举要序列化,需要加一个特性:

[JsonConverter(typeof(JsonStringEnumConverter))]

补充

本文用到的Json库是:

 以前用这个

 现在微软主推上面这个。

相关文章:

  • 使用VsCode搭建Vue开发环境
  • RK3568+Codesys ARM+LINUX硬件平台的软PLC解决方案
  • 三、python基础——六大基本数据类型
  • 用Python进行数学建模(二)
  • 你把 《时间》 玩明白
  • 飞桨机器学习最小实现,出租车计费规则预测
  • 【andriod】设备APP开发之各种细节部署和操作
  • 矩阵论习题1.1
  • OAuth2-单点-多点-三方登录
  • SSO 基于token vue + element ui spring boot前端分离
  • pandas:jupyter notebook笔记(更新中)
  • 牛客网刷题——JAVA
  • Tpflow V6.0.8 正式版发布
  • 中缀转后缀表达式(思路分析) [数据结构][Java]
  • WhatsApp Business 与 Google My Business:它们的运作方式和不同之处
  • 10个确保微服务与容器安全的最佳实践
  • CentOS 7 防火墙操作
  • Docker下部署自己的LNMP工作环境
  • eclipse(luna)创建web工程
  • Git同步原始仓库到Fork仓库中
  • Intervention/image 图片处理扩展包的安装和使用
  • Java 最常见的 200+ 面试题:面试必备
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • mongodb--安装和初步使用教程
  • SegmentFault 2015 Top Rank
  • select2 取值 遍历 设置默认值
  • SpringBoot 实战 (三) | 配置文件详解
  • Web Storage相关
  • 百度地图API标注+时间轴组件
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端面试题总结
  • 如何利用MongoDB打造TOP榜小程序
  • 我有几个粽子,和一个故事
  • ​secrets --- 生成管理密码的安全随机数​
  • ​如何在iOS手机上查看应用日志
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (差分)胡桃爱原石
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (超详细)语音信号处理之特征提取
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)ABI是什么
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)Unity3DUnity3D在android下调试
  • (转)平衡树
  • **CI中自动类加载的用法总结
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NetCore 如何动态路由
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .sh