首页 > 编程语言 >【C#】复杂数据结构和Json的相互转换

【C#】复杂数据结构和Json的相互转换

时间:2024-10-11 10:01:36浏览次数:1  
标签:connectionWay string C# baseInfo Json ToString new 数据结构 public

数据结构定义

//数据结构定义
public class People
{
    public string name;
    public BaseInfo baseInfo;
    public List<School> education;
}
public class BaseInfo
{
    public int age;
    public bool gender;
    public List<Connection> connection;
}
注意一:Json结果展示枚举对于字符串

枚举数据转Json会转成对应数值

connectionWay = ConnectionWay.phone,
==>实际
"connectionWay" = 0,   
==>目标
"connectionWay" = “phone”, 

如果需要在json中展示枚举的字符串,需要增加

[JsonConverter(typeof(StringEnumConverter))]

public class Connection
{
    [JsonConverter(typeof(StringEnumConverter))] 
    public ConnectionWay connectionWay;
    public string text;
}
public enum ConnectionWay
{
    phone,
    email
}
注意二:Json结果展示私有变量

数据结构转Json过程中私有变量无法转换成功,需要增加

[JsonObject(MemberSerialization.OptIn)]定义在数据结构声明处

[JsonProperty]定义在需要json化私有变量声明处

[JsonObject(MemberSerialization.OptIn)]
public class School{
    [JsonProperty]
    private string name;
    [JsonProperty]
    private int completeYear;
    [JsonProperty]
    [JsonConverter(typeof(StringEnumConverter))]
    private EducationType educationType;
    
    private string address;
    public School(string name,int completeYear,EducationType educationType,string address = "")
    {
        ...;
    }
}
public enum EducationType
{
    highSchool,
    college
}

数据实例

People p = new People(){
    name = "Andy",
    baseInfo = new BaseInfo{
        age = 23,
        gender = false,
        connection = new List<Connection> {
            new Connection{
                connectionWay = ConnectionWay.phone,
                text = "88888888"
            },
            new Connection{
                connectionWay = ConnectionWay.email,
                text = "[email protected]"
            }
        }
    },
    education = new List<School> {
        new School("某211",2017,EducationType.college,"北京市"),
        new School("某高级中学",2013,EducationType.highSchool,"孔子县")
    }
};

数据保存为Json文件

private void SaveData2JsonFile(string filePath)
{
    string json = JsonConvert.SerializeObject(p);
    using (System.IO.StreamWriter file = new System.IO.StreamWriter(filePath))
    {
        JObject jobject = JObject.Parse(json);
        file.Write(jobject.ToString());
    }
}

json文件内容

丢失School.address,由于定义时没有处理。

{
    "name":"Andy",
    "baseInfo":{
        "age" : 23,
        "gender" : false,
        "connection":[{
            "connectionWay":"phone",
            "text": "88888888"
        },{
            "connectionWay":"email",
            "text": "[email protected]"
        }]
    },
    "education":[{
        "name":"某211",
        "completeYear":2017,
        "educationType":"college"
    },{
        "name":"某高级中学",
        "completeYear":2013,
        "educationType":"highSchool"
    }]
}

解析Json为对应数据结构实例

JsonUtility.FromJson<T>(json)

jObject["字段名"].ToObject<T>()

无法正确的转换List、嵌套数据结构等,只能解析简单数据结构

public void LoadJsonFile(string filePath)
{
    using (System.IO.StreamReader file = System.IO.File.OpenText(filePath))
    {
        using (JsonTextReader reader = new JsonTextReader(file))
        {
            Json2DataModel((JObject)JToken.ReadFrom(reader));
        }
    }
}
private void Json2DataModel(JObject jObject)
{
    List<School> education = new List<School>();
    foreach (var item in JArray.Parse(jObject["education"].ToString()))
    {
        education.Add(new School(
            item["name"].ToString(),
            int.Parse(item["completeYear"].ToString()),
            (EducationType)Enum.Parse(typeof(EducationType), item["educationType"].ToString())
        ));
    }

    BaseInfo baseInfo = jObject["baseInfo"].ToObject<BaseInfo>();
    List<Connection> connection = new List<Connection>();
    foreach (var item in JArray.Parse(jObject["baseInfo"]["connection"].ToString()))
    {
        ConnectionWay connectionWay = (ConnectionWay)Enum.Parse(typeof(ConnectionWay), item["connectionWay"].ToString());
        Connection conn = JsonUtility.FromJson<Connection>(item.ToString());
        connection.Add(conn);
    }
    baseInfo.connection = connection;

    People p = JsonUtility.FromJson<People>(jObject.ToString());
    p.baseInfo = baseInfo;
    p.education = education;
}

标签:connectionWay,string,C#,baseInfo,Json,ToString,new,数据结构,public
From: https://www.cnblogs.com/sitarblogs/p/18457840

相关文章

  • 宅急送数字化转型新篇章:以数兴企洞察客户需求,CRM赋能客户价值全面提升
    宅急送1994年成立于中国北京,是一家全国性综合物流服务企业。公司定位“综合物流一体化解决方案专家”,依托宅急送强大体系资源与业务架构支撑,致力于为大品牌商提供分销渠道供应链物流管理服务、为平台电商提供供应链物流服务。作为中国最早的民营快递企业之一,宅急送是专业的快递、......
  • Debian12 docker容器使用N卡GPU(以emby为例,其他docker容器也可以参考)
    加源安装curl-s-Lhttps://nvidia.github.io/nvidia-docker/gpgkey>/etc/apt/keyrings/nvidia-docker.keycurl-s-Lhttps://nvidia.github.io/nvidia-docker/debian11/nvidia-docker.list>/etc/apt/sources.list.d/nvidia-docker.listsed-i-e"s/^deb/de......
  • 华为机顶盒ec6108v9a刷机笔记
    背景: 家里的不用的机顶盒,联通版,品牌是华为ec6108v9a。芯片是rk312x目的:让机顶盒能支持无线投屏。现状:该机顶盒的无线网络口被关闭,没办法打开,且按照网络上的开机狂按待机键,仍然无法进入刷机界面,没办法实现u盘刷机。经过无数次的狂按待机失败,只能放弃,后来通过华为STB管理软件......
  • 设计方案:FMC303-两路5.6Gsps 14bit DA FMC子卡
    一、板卡概述    FMC303可实现宽波段、双通道、14位、5.6GSPS(2.8gsps直接射频综合)DAC功能,时钟可采用内部时钟源(可选择锁定到外部参考),或外部提供的采样时钟。此外还为用户提供定制采样控制的触发器输入。FMC303在机械上和电气上符合FMC标准(ANSI/VITA 57.1)。该卡具有多引脚连......
  • 大数据-164 Apache Kylin Cube优化 案例1 定义衍生维度与对比 超详细
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(已更完)Kudu(已更完)Druid(已更完)Kylin(正在更新…)章节内容上节......
  • 一个使用Oracle GoldenGate实现数据复制的例子
    OracleGoldenGate是一种数据复制和实时数据集成软件,用于在不同数据库之间进行数据同步和复制。以下是一个使用OracleGoldenGate实现数据复制的例子:假设我们有两个Oracle数据库实例:源数据库(source)和目标数据库(target),我们希望将源数据库中的某个表的数据实时复制到目标数据库......
  • 【教程】0x04 绘制记牌器窗口及插件打包 —— 通过MYScrcpy学python系列
    前言MYScrcpyGithub/Gitee从1.6.4版本开始,MYScrcpy为童鞋们提供了一个开放的插件开发环境(Extensions)。童鞋们可以根据需要自行开发插件。本章主要讲解如何通过面向对象的思想,借助Dearpygui绘制一个记牌器面板,同时如何打包插件进行共享。注意插件用于功能测试及......
  • 大数据-162 Apache Kylin 全量增量Cube的构建 Segment 超详细记录 多图
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(已更完)Kudu(已更完)Druid(已更完)Kylin(正在更新…)章节内容上节......
  • jsp大连东软人才培训中心oa系统tc617--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表员工,部门,岗位,会议室类型,会议室,会议室预约,会议室取消,考勤信息,日程信息,员工请假,公文信息开题报告内容一、研究背景随着信息技术的不断发展和企业管理......
  • 结合HCI和空口理解BLE AUDIO CIS
    背景CIS,coordinateisochronosstream,是BLEAUDIO单播形式的数据流,在前面文章https://blog.csdn.net/Jzj1234555/article/details/142416588?spm=1001.2014.3001.5502我们了解了BLEAUDIO从连接到建立CIS的大概流程,但CIS到底是什么样的形式,如何在空中传播,里面的细节我们......