使用Text.json解析Json文件

该代码实现了一个用于Modbus通信的变量类库,包括变量名称、存储区域、地址等属性,并能从JSON文件中解析数据,用于设备监控和数据管理。此外,还提供了将数据转换为JSON字符串的辅助方法。

建立一个modbus变量类库

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JsonPractice
{
    public class Variable_Modbus
    {
        //变量名称
        public string VarName { get; set; }
        //存储区域
        public string StoreArea { get; set; }
        //地址
        public string Address { get; set; }
        //数据类型
        public string DataType { get; set; }
        //是否归档 是否存入数据库
        public string IsFiling { get; set; }
        //是否报警
        public string IsAlarm { get; set; }
        //是否制作报表
        public string IsReport { get; set; }
        //变量注释说明
        public string Note { get; set; }
        //绝对地址
        private string absoluteAddress;
        //判断存储区
        public string AbsoluteAddress
        {
            get
            {
                int store = 0;
                switch (StoreArea)//通过存储区判断并显示存储位置
                {
                    case "01 Coil Status(0x)":
                        store = 0;
                        break;
                    case "02 Input Status(1x)":
                        store = 1;
                        break;
                    case "03 Holding Register(4x)":
                        store = 4;
                        break;
                    case "04 Input Registers(3x)":
                        store = 3;
                        break;
                    default:
                        store = 4; //默认值
                        break;
                }
                absoluteAddress = (store * 10000 + Convert.ToInt32(Address)).ToString();//30001,40001开始
                return absoluteAddress;
            }
            set
            {
                value = absoluteAddress;
            }
        }
    }
}

建立一个helper

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.Json;
using System.Text.Encodings.Web;

namespace Tool
{
    public static class JsonTool
    {
        public static string ToJson<T>(this T obj)
        {
            return JsonSerializer.Serialize(obj, typeof(T),
                new JsonSerializerOptions
                {
                    Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
                });
        }
    }
}

解析json

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.Encodings.Web;
using Tool;
using System.IO;
using System.Xml;
//using Newtonsoft.Json;
using System.Text.Json;



namespace JsonPractice
{
    class Program
    {
        static void Main(string[] args)
        {
            Student stu = new Student() {Id=10001,Name="张三",Phonenumber="1505050505" };

            //var jsonstu = JsonSerializer.Serialize(stu, typeof(Student),
            //new JsonSerializerOptions
            //{
            //    Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            //});

            //System.Text.Json.Utf8JsonReader
            //Console.WriteLine(JsonTool.ToJson(stu));
            //Console.ReadKey();
            //Student aa = JsonSerializer.Deserialize<Student>(fs, new JsonSerializerOptions
            //{
            //    Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            //});
            //Console.WriteLine("{0},{1},{2}", aa.Id, aa.Name, aa.Phonenumber);
            //Console.ReadKey();

            //JsonSerializer.Serialize<Variable_Modbus>(fs, jsonstu,
            //   new JsonSerializerOptions
            //   {
            //       Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            //   });

            JsonSerializerOptions jso = new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            };
            
            string FilePath = "D:\\jsontxt.json";
            string FilePath2 = "D:\\Variable_Modbus.json";
            FileStream fs = new FileStream(FilePath2, FileMode.Open);

            JsonDocument doc = JsonDocument.Parse(fs);
            List<Variable_Modbus> VarModbusList = new List<Variable_Modbus>();

            var ip = doc.RootElement.GetProperty("Root").GetProperty("Variable")[0].GetProperty("VarName");

            foreach (var item in doc.RootElement.GetProperty("Root").GetProperty("Variable").EnumerateArray())
            {
                Variable_Modbus objVar = new Variable_Modbus();

                objVar.VarName = item.GetProperty("VarName").GetString();
                objVar.Address = item.GetProperty("Address").GetString();
                objVar.DataType = item.GetProperty("DataType").GetString();
                objVar.StoreArea = item.GetProperty("StoreArea").GetString();
                objVar.IsFiling = item.GetProperty("IsFiling").GetString();
                objVar.IsAlarm = item.GetProperty("IsAlarm").GetString();
                objVar.IsReport = item.GetProperty("IsReport").GetString();
                objVar.Note = item.GetProperty("Note").GetString();
                objVar.AbsoluteAddress = item.GetProperty("AbsoluteAddress").GetString();
                VarModbusList.Add(objVar);
            }

            for (int i = 0; i < VarModbusList.Count; i++)
            {
                Console.WriteLine(VarModbusList[i].Note);
            }

            //var age = doc.RootElement.GetProperty("Variable");
            Console.WriteLine(VarModbusList[0].Note);
            Console.ReadKey();

            /// 转换XML为json
            //XmlDocument doc = new XmlDocument();

            //FileStream fs = new FileStream(FilePath2, FileMode.Open);
            //doc.Load(fs);
            //string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc);
            //Console.WriteLine("XML -> JSON: {0}", json);
            //Console.ReadKey();

        }
    }
}

json文件

{
  "Root": {
    "Variable": [
      {
        "VarName": "LQT_Level",
        "Address": "0",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "冷却塔液位",
        "IsFiling": "1",
        "IsAlarm": "1",
        "IsReport": "1",
        "AbsoluteAddress": "40000"
      },
      {
        "VarName": "LQT_InPre",
        "Address": "2",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "冷却塔入口压力",
        "IsFiling": "1",
        "IsAlarm": "1",
        "IsReport": "1",
        "AbsoluteAddress": "40002"
      },
      {
        "VarName": "LQT_InTemp",
        "Address": "4",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "冷却塔入口温度",
        "IsFiling": "1",
        "IsAlarm": "1",
        "IsReport": "1",
        "AbsoluteAddress": "40004"
      },
      {
        "VarName": "LQT_OutPre",
        "Address": "6",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "冷却塔出口压力",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40006"
      },
      {
        "VarName": "LQT_OutTemp",
        "Address": "8",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "冷却塔出口温度",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40008"
      },
      {
        "VarName": "LQT_BSPre",
        "Address": "10",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "冷却塔补水压力",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40010"
      },
      {
        "VarName": "LQB1_Current",
        "Address": "12",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#冷却泵电流",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40012"
      },
      {
        "VarName": "LQB1_Fre",
        "Address": "14",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#冷却泵频率",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40014"
      },
      {
        "VarName": "LQB2_Current",
        "Address": "16",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#冷却泵电流",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40016"
      },
      {
        "VarName": "LQB2_Fre",
        "Address": "18",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#冷却泵频率",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40018"
      },
      {
        "VarName": "KYJ1_OutTemp",
        "Address": "20",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#空压机回水温度",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40020"
      },
      {
        "VarName": "KYJ2_OutTemp",
        "Address": "22",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#空压机回水温度",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40022"
      },
      {
        "VarName": "KYJ3_OutTemp",
        "Address": "24",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "3#空压机回水温度",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40024"
      },
      {
        "VarName": "CQG1_OutPre",
        "Address": "26",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#储气罐出口压力",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40026"
      },
      {
        "VarName": "CQG2_OutPre",
        "Address": "28",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#储气罐出口压力",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40028"
      },
      {
        "VarName": "CQG3_OutPre",
        "Address": "30",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "3#储气罐出口压力",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40030"
      },
      {
        "VarName": "Env_Temp",
        "Address": "32",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "露点温度",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40032"
      },
      {
        "VarName": "FQG_Temp",
        "Address": "34",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "分汽缸温度",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40034"
      },
      {
        "VarName": "FQG_Pre",
        "Address": "36",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "分汽缸压力",
        "IsFiling": "1",
        "IsAlarm": "0",
        "IsReport": "1",
        "AbsoluteAddress": "40036"
      },
      {
        "VarName": "LQT_InPre_H",
        "Address": "38",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "冷却塔回水压力高限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40038"
      },
      {
        "VarName": "LQT_InTemp_H",
        "Address": "40",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "冷却塔回水温度高限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40040"
      },
      {
        "VarName": "LQT_OutPre_H",
        "Address": "42",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "冷却塔供水压力高限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40042"
      },
      {
        "VarName": "LQT_OutTemp_H",
        "Address": "44",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "冷却塔供水温度高限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40044"
      },
      {
        "VarName": "LQB1_Fre_H",
        "Address": "46",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#冷却泵频率高限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40046"
      },
      {
        "VarName": "LQB1_Fre_L",
        "Address": "48",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#冷却泵频率低限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40048"
      },
      {
        "VarName": "LQB2_Fre_H",
        "Address": "50",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#冷却泵频率高限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40050"
      },
      {
        "VarName": "LQB2_Fre_L",
        "Address": "52",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#冷却泵频率低限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40052"
      },
      {
        "VarName": "KYJ1_Fre_Set",
        "Address": "54",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#空压机频率给定",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40054"
      },
      {
        "VarName": "KYJ2_Fre_Set",
        "Address": "56",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#空压机频率给定",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40056"
      },
      {
        "VarName": "KYJ3_Fre_Set",
        "Address": "58",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "3#空压机频率给定",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40058"
      },
      {
        "VarName": "FQG_Temp_H",
        "Address": "60",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "分汽缸温度高限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40060"
      },
      {
        "VarName": "FQG_Pre_H",
        "Address": "62",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "分汽缸压力高限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40062"
      },
      {
        "VarName": "Env_Temp_H",
        "Address": "64",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "露点温度高限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40064"
      },
      {
        "VarName": "Env_Temp_L",
        "Address": "66",
        "DataType": "Float",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "露点温度低限",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40066"
      },
      {
        "VarName": "LQB1_Start_Ctl",
        "Address": "100",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#冷却泵启动",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40100"
      },
      {
        "VarName": "LQB1_Stop_Ctl",
        "Address": "101",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#冷却泵停止",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40101"
      },
      {
        "VarName": "LQB1_Run_State",
        "Address": "102",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#冷却泵运行状态",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40102"
      },
      {
        "VarName": "LQB2_Start_Ctl",
        "Address": "103",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#冷却泵启动",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40103"
      },
      {
        "VarName": "LQB2_Stop_Ctl",
        "Address": "104",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2# 冷却泵停止",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40104"
      },
      {
        "VarName": "LQB2_Run_State",
        "Address": "105",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#冷却泵运行状态",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40105"
      },
      {
        "VarName": "KYJ1In_Open_Ctl",
        "Address": "106",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#空压机进液阀开启",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40106"
      },
      {
        "VarName": "KYJ1In_Close_Ctl",
        "Address": "107",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#空压机进液阀关闭",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40107"
      },
      {
        "VarName": "KYJ1In_Run_State",
        "Address": "108",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "1#空压机进液阀状态",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40108"
      },
      {
        "VarName": "KYJ2In_Open_Ctl",
        "Address": "109",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#空压机进液阀开启",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40109"
      },
      {
        "VarName": "KYJ2In_Close_Ctl",
        "Address": "110",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#空压机进液阀关闭",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40110"
      },
      {
        "VarName": "KYJ2In_Run_State",
        "Address": "111",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "2#空压机进液阀状态",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40111"
      },
      {
        "VarName": "KYJ3In_Open_Ctl",
        "Address": "112",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "3#空压机进液阀开启",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40112"
      },
      {
        "VarName": "KYJ3In_Close_Ctl",
        "Address": "113",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "3#空压机 进液阀关闭",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40113"
      },
      {
        "VarName": "KYJ3In_Run_State",
        "Address": "114",
        "DataType": "Unsigned",
        "StoreArea": "03 Holding Register(4x)",
        "Note": "3#空压机进液阀状态",
        "IsFiling": "0",
        "IsAlarm": "0",
        "IsReport": "0",
        "AbsoluteAddress": "40114"
      }
    ]
  }
}

Excel转json

           //var age = doc.RootElement.GetProperty("Variable");
            //for (int i = 0; i < VarModbusList.Count; i++)
            //{
            //    Console.WriteLine(VarModbusList[i].Note);
            //}
            //Console.ReadKey();
            string FilePath3 = @"D:\DB\ConfigFile\shenhua.xlsx";

            //ExcelTool exceltool = new ExcelTool();

            using(var packege = new ExcelPackage(FilePath3))
            {
                int columnIndexVarName = 3; //第N列
                int columnIndexNote = 4;
                int rowStartIndex = 2;
                int rowEndIndex = 60;
                ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
                List<string> listVarName = new List<string>();
                List<string> listNote = new List<string>();
                ExcelWorksheet sheet = packege.Workbook.Worksheets[0];
                //var cell = sheet.Cells[50, columnIndex];
                for (int i = rowStartIndex; i < rowEndIndex; i++)
                {
                    var cell = sheet.Cells[i, columnIndexVarName];
                    listVarName.Add(cell.Value.ToString());
                }

                for (int i = rowStartIndex; i < rowEndIndex; i++)
                {
                    var cell = sheet.Cells[i, columnIndexNote];
                    listNote.Add(cell.Value.ToString());
                }


            }
<think>好的,我现在需要帮助用户了解如何使用System.Text.Json.NET Core中解析JSON数据。首先,我得回顾一下已有的引用内容,确保回答准确。用户可能是一个开发者,正在迁移项目到.NET Core,或者是从Newtonsoft.Json转过来的,所以需要对比两者吗?不过用户的问题更关注于具体的解析方法,所以应该专注于System.Text.Json使用步骤。 用户需要的是解析JSON文件或字符串的示例教程。根据引用[3],里面提到了使用JsonSerializer.Deserialize方法,这可能是一个关键点。引用[2]和[4]提到System.Text.Json.NET内置的库,可能用户需要知道基本操作而不是第三方库。 首先,解析字符串的话,应该用JsonSerializer.Deserialize<T>(jsonString)。对于文件,可能需要读取文件内容,然后同样反序列化。需要注意异步操作,比如用File.ReadAllTextAsync。此外,引用[1]提到功能差异,可能需要指出一些注意事项,比如大小写敏感或默认设置的不同。 用户可能需要代码示例,所以应该提供解析字符串和文件的例子,包括同步和异步方法。还要提到配置选项,比如PropertyNamingPolicy,这在处理不同命名约定时很重要。例如,JSON属性名是驼峰式,而C#属性是大写,可以用JsonSerializerOptions来处理。 另外,异常处理也很重要,比如捕获JsonException,这样用户知道如何处理无效的JSON数据。可能还需要提到如何处理复杂对象和嵌套结构,但用户的问题可能更基础,所以保持示例简单。 总结步骤:解析字符串的步骤,解析文件的步骤,配置选项,错误处理。引用相关的引用资料,比如引用[3]中的反序列化示例,引用[4]中的内置支持说明。确保代码格式正确,用中文解释每个步骤,并自然添加引用标记。</think>以下是使用 $System.Text.Json$ 解析 JSON 数据的详细步骤和示例: --- ### **1. 解析 JSON 字符串** ```csharp using System.Text.Json; // 示例 JSON 字符串 string jsonString = @"{ ""Name"": ""张三"", ""Age"": 28, ""IsStudent"": false }"; // 定义对应的 C# 类 public class Person { public string Name { get; set; } public int Age { get; set; } public bool IsStudent { get; set; } } // 反序列化操作 Person person = JsonSerializer.Deserialize<Person>(jsonString); Console.WriteLine($"姓名: {person.Name}, 年龄: {person.Age}"); ``` --- ### **2. 解析 JSON 文件** #### 同步读取文件: ```csharp string filePath = "data.json"; string jsonContent = File.ReadAllText(filePath); Person person = JsonSerializer.Deserialize<Person>(jsonContent); ``` #### 异步读取文件(推荐): ```csharp using System.IO; using System.Threading.Tasks; async Task<Person> ReadJsonFileAsync(string filePath) { using FileStream fileStream = File.OpenRead(filePath); return await JsonSerializer.DeserializeAsync<Person>(fileStream); } ``` --- ### **3. 配置反序列化选项** 若 JSON 属性名与 C# 类属性名不匹配(如驼峰命名法),需配置 $JsonSerializerOptions$: ```csharp var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 支持驼峰命名 WriteIndented = true // 格式化输出 }; // 使用配置反序列化 Person person = JsonSerializer.Deserialize<Person>(jsonString, options); ``` --- ### **4. 处理复杂对象和嵌套结构** 若 JSON 包含嵌套对象或数组: ```csharp string json = @"{ ""Department"": ""技术部"", ""Employees"": [ { ""Name"": ""李四"", ""Age"": 30 } ] }"; public class Company { public string Department { get; set; } public List<Person> Employees { get; set; } } Company company = JsonSerializer.Deserialize<Company>(json); ``` --- ### **5. 错误处理** 通过 try-catch 捕获无效 JSON 格式异常: ```csharp try { Person person = JsonSerializer.Deserialize<Person>(jsonString); } catch (JsonException ex) { Console.WriteLine($"JSON 解析失败: {ex.Message}"); } ``` --- ### **对比 Newtonsoft.Json** - $System.Text.Json$ 默认 **区分大小写**,而 Newtonsoft.Json 默认不区分[^1] - 性能更高,但功能较少(如无 $JsonConvert.PopulateObject$)[^2] - 内置支持 .NET Core 3.0+,无需安装第三方包[^4] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘诺西亚的火山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值