繁体   English   中英

在 C# 中读取和写入嵌套数据 JSON

[英]Reading and Writing Nested data JSON in C#

我已经在网上查看了几种关于读取嵌套 json 文件的解决方案,但我还没有找到适合我需要的解决方案。 也许是因为我是 JSON 新手。 这是我的问题:

我在一个文件中有以下 JSON:

{
  "ConfigError" : {
    "DateSent": "2022-04-28T14:03:16.6628493-07:00",
    "ToolType": "WSM",
    "IsSent": true
  },

  "FileCopyError" : {
    "DateSent": "2022-06-14T14:03:16.6628493-07:00",
    "ToolType": "RMT",
    "IsSent": false
  }
}

为此,我编写了两个类。 一个用于内部对象:

public class SummaryEmailStatus
    {
        public DateTime DateSent { get; set; }
        public string ToolType { get; set; }
        public bool IsSent { get; set; }
    }

一个用于外部对象:

public class SummaryEmailClass
    {
        SummaryEmailStatus Status { get; set; } = new SummaryEmailStatus();
    }

我希望能够在 C# 中读取 JSON。 我主要关心内部对象。 它们属于同一类,但需要以不同的方式使用。 因此,理想情况下,我想要一个可以将“ConfigError”或“FileCopyError”传入的函数,它将返回由 JSON 中的值填充的 SummaryEmailStatus 类对象:

public static void ReadJasonFile(string jsonFileName, string objctName)
        {
            List<SummaryEmailClass> emailClassList = new List<SummaryEmailClass>();
            dynamic jsonFile = JsonConvert.DeserializeObject(File.ReadAllText(jsonFileName));
            SummaryEmailStatus sumclass = jsonFile[objctName];
        }

但这给了我一个运行时错误说:

无法将类型“Newtonsoft.Json.Linq.JObject 隐式转换为 SummaryEmailStatus”

如何成功解析出内部的summaryemailstatus对象?

此外,我希望能够在 C# 中创建 JSON 数据。 原因是,当我读取 JSON 时,我将执行一些任务,然后需要使用当前时间戳更新 JSON 的值。 我想,我需要重写文件。 如何在 C# 中编写这样的嵌套 JSON?

如果 JSON 不是做到这一点的最佳方式,我愿意接受替代方案

你可以试试

string json = File.ReadAllText(jsonFileName);

Dictionary<string,SummaryEmailStatus> summaryEmailStatus = 
JsonConvert.DeserializeObject<Dictionary<string,SummaryEmailStatus>>(json);

你可以使用它

SummaryEmailStatus configError =   summaryEmailStatus["ConfigError"];

如果你想更新数据

summaryEmailStatus["ConfigError"].DateSent= DateTime.Now;

并序列化回来

json = JsonConvert.SerializeObject(summaryEmailStatus);

或者如果您只有 2 个主要属性,请创建一个类

public class SummaryEmailClass
    {
        SummaryEmailStatus ConfigError { get; set; } 
        SummaryEmailStatus FileCopyError{ get; set; } 
    }

并使用它

SummaryEmailClass summaryEmailStatus = 
JsonConvert.DeserializeObject<SummaryEmailStatusClass>(json);

SummaryEmailStatus configError =   summaryEmailStatus.ConfigError;

概括

您需要将 JObject 转换为您期望的类型,如下所示:

SummaryEmailStatus sumclass = jsonFile[objctName].ToObject<SummaryEmailStatus>();

细节

jsonFile[objtName] 是 JObject 类型。 原因是因为 JsonConvert.DeserializeObject 不知道您打算将其转换为 SummaryEmailStatus 列表。

拥有 JObject 数组后,您可以将其转换为 SummaryEmailStatus,如以下代码段所示:

public static void ReadJasonFile(string jsonFileName, string objctName)
{
    List<SummaryEmailClass> emailClassList = new List<SummaryEmailClass>();
    dynamic jsonFile = JsonConvert.DeserializeObject(File.ReadAllText(jsonFileName));
    SummaryEmailStatus sumclass = jsonFile[objctName].ToObject<SummaryEmailStatus>();
}

简单的方法是将两个对象都保存在 JSON 中,我重写你的代码并添加根。 例如,如果你想写Config Error而不写File Copy Error ,你可以像 null 一样保存其中一个。

public class ConfigError
{
    public DateTime DateSent { get; set; }
    public string ToolType { get; set; }
    public bool IsSent { get; set; }
}

public class FileCopyError
{
    public DateTime DateSent { get; set; }
    public string ToolType { get; set; }
    public bool IsSent { get; set; }
}

public class Root
{
    public ConfigError ConfigError { get; set; }
    public FileCopyError FileCopyError { get; set; }
}

//in your method to get all data
var json = File.ReadAllText(jsonFileName);
var myDeserializedClass = JsonConvert.DeserializeObject<Root>(json);

示例更改配置并写入文件

var json = @"{
  ""ConfigError"" : {
    ""DateSent"": ""2022-04-28T14:03:16.6628493-07:00"",
    ""ToolType"": ""WSM"",
    ""IsSent"": true
  },

  ""FileCopyError"" : {
    ""DateSent"": ""2022-06-14T14:03:16.6628493-07:00"",
    ""ToolType"": ""RMT"",
    ""IsSent"": false
  }
}";

var conf = JsonConvert.DeserializeObject<Root>(json);
conf.ConfigError.DateSent = DateTime.Now;
conf.ConfigError.ToolType = "New way";
conf.ConfigError.IsSent = false;
conf.FileCopyError = null;
var newJson = JsonConvert.SerializeObject(conf);
File.WriteAllText("your path", newJson);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM