我已經在網上查看了幾種關于讀取嵌套 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 不是做到這一點的最佳方式,我愿意接受替代方案
uj5u.com熱心網友回復:
你可以試試
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;
uj5u.com熱心網友回復:
概括
您需要將 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>();
}
uj5u.com熱心網友回復:
簡單的方法是將兩個物件都保存在 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);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490926.html
