繁体   English   中英

将 JSON 转换为 c# 字典

[英]convert JSON to c# dictionary

我有一个 .json 文件,我想将其转换为 c# 字典(字符串,字符串)。

JSON 看起来像:

[
    {
        "data": "data",
        "id": "1"
    },
    {
        "data": "data2",
        "id": "2"
    }
]

实现它的最简单方法是什么?

您问题中的 JSON 是一个对象数组,其中包含与键和值相对应的两个属性,您希望将 map 指向包含这些键和值的Dictionary<string, string> ,例如{"data":"1","data2":"2"}{"1":"data","2":"data2"} (您的问题不清楚您想要哪个)。

为此,首先引入与数组中的 JSON 对象对应的 DTO:

record DataItemDTO(string data, string id);

但是在早于 c# 9 / .NET 5 的 c# 版本中,如@ flydog57所述,改为定义:

public class DataItemDTO { public string data {get; set;} public string id {get; set;} }

现在你可以这样做:

await using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 4096, useAsync: true);
var list = await JsonSerializer.DeserializeAsync<List<DataItemDTO>>(stream);
var dictionary = list?.ToDictionary(d => d.data, d => d.id);

演示小提琴#1在这里

或者,如果您希望将"id"属性用作字典键,请执行以下操作:

var dictionary = list?.ToDictionary(d => d.id, d => d.data);

演示小提琴#2在这里

如果您希望使用同步 IO,请执行以下操作:

using var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
var list = JsonSerializer.Deserialize<List<DataItemDTO>>(stream);

演示小提琴#3在这里

笔记:

  • 这里的path是一个 c# 字符串,其中包含磁盘上 JSON 文件的路径。 在您的评论中,您提到您尝试了File.ReadAllText(@"PATH")但此代码可能失败,因为它试图读取名为PATH的文件,而不是位于某个指定路径的文件。

  • 如果您的 JSON 对象数组包含字典键属性的重复值,例如,如果您想使用"data"作为键:

     [ { "data": "data", "id": "1" }, { "data": "data", "id": "2" } ]

    您将收到System.ArgumentException: An item with the same key has already been added构建字典。

暂无
暂无

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

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