[英]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.