C# -将JSON对象数组初始化为字典

5q4ezhmt  于 2023-10-21  发布在  C#
关注(0)|答案(3)|浏览(170)
{
   "TestObjects": [
     {"the": "goal"},
     {"is": "to"},
     {"deserialize": "this"},
     {"simple": "array"},
     {"of": "objects"},
     {"into": "a"},
     {"C#": "Dictionary"}
    ]
}

使用.NET System.Text.JSON。寻找一种方法来将每个对象都有两个字符串的对象数组(如上所示)转换为Dictionary<string,string>。
我已经看到了描述将对象化为Dictionary<string, string>[]的答案,其中每个对象都被放置在不同的Dictionary<string, string>中,这是可行的。例如,十个对象会产生一个包含十个字典的数组。下面的例子工作:

public class TestClass
{
    public Dictionary<string, string>[] TestObjects { get; set; }
}

var stream = File.OpenRead(@"C:\test\test.json");

TestClass result = JsonSerializer.Deserialize<TestClass>(stream);

因此,参考上面的示例,目标是将其转换为形式为
Dictionary<string, string> TestObjects { get; set; }
Dictionary<string, string>[] TestObjects { get; set; }
谢谢你

更新-答案

得到了几个可行和有用的答案。我使用了Sonny N的答案,它涉及简单地更改JSON数据格式,以便将其直接转换为字典:

{
  "TestObjects": {
    "the": "goal",
    "is": "to",
    "convert": "this",
    "simple": "array",
    "of": "objects",
    "into": "a",
    "C#": "Dictionary"
  }
}

有时,对于这样的问题,回答的人无法知道JSON格式是否可编辑,因为在某些情况下,它可能通过网络等接收,并且必须按原样进行格式化。在我的情况下,格式是手动编辑的,而且很灵活,所以我能够使用更好的格式。然而,其他优秀的答案适用于传入的JSON格式不灵活的情况。

mnowg1ta

mnowg1ta1#

为了使它成为一个字典,它必须是这样的格式:

{
  "TestObjects": {
    "the": "goal",
    "is": "to",
    "convert": "this",
    "simple": "array",
    "of": "objects",
    "into": "a",
    "C#": "Dictionary"
  }
}

但是,您可以添加另一个只读属性,将字典数组转换为一个字典。

public class TestClass1
{
    public Dictionary<string, string>[] TestObjects { get; set; }

    public Dictionary<string, string> TestObjectsDict
    {
        get
        {
            return TestObjects.Select(x => x.First()).ToDictionary(x => x.Key, x => x.Value);
        }
    }
}
fzsnzjdm

fzsnzjdm2#

你可以使用一个简单的转换器。
[JsonConverter(...)]装饰房产:

public class TestClass2 {
    [JsonConverter(typeof(ObjectsToDictionaryConverter))]
    public Dictionary<string, string> TestObjects { get; set; }
}

自定义转换器从对象数组中读取每个属性和值,并将它们用作字典的键和值。
假设所有 keys(属性)都有不同的名称。
Utf8JsonReader到达数组的末尾时,即当[Utf8JsonReader].TokenType == JsonTokenType.EndArray时,返回字典:
注意:这里没有真实的错误检查。我把它留给您,因为您知道真实的JSON包含什么。

class ObjectsToDictionaryConverter : JsonConverter<Dictionary<string, string>> {
    public override Dictionary<string, string> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) {

        if (reader.TokenType != JsonTokenType.StartArray) {
            throw new JsonException($"Array of objects expected. Got {reader.TokenType}");
        }

        var dict = new Dictionary<string, string>();
        while (reader.Read()) {
            if (reader.TokenType == JsonTokenType.EndArray) break;

            if (reader.TokenType == JsonTokenType.StartObject) {
                reader.Read();
                string key = reader.GetString();
                reader.Read();
                string value = reader.GetString();
                dict.Add(key, value);
            }
        }
        return dict;
    }

    public override void Write(Utf8JsonWriter writer, Dictionary<string, string> value, JsonSerializerOptions options) {
        throw new NotImplementedException();
    }
}
a7qyws3x

a7qyws3x3#

可以将数组转换为字典

Dictionary<string, string> result = JsonDocument.Parse(json)
            .RootElement.GetProperty("SimpleArray").EnumerateArray()
            .ToDictionary(x => x.EnumerateObject().FirstOrDefault().Name,
                        x => x.EnumerateObject().FirstOrDefault().Value.ToString());

但是记住字典应该有唯一的键,否则你会得到一个异常
或者,如果你想转换成一个类,你需要写一个json转换器。

TestClass result = System.Text.Json.JsonSerializer.Deserialize<TestClass>(json);

public class ToDictConverter : System.Text.Json.Serialization.JsonConverter<Dictionary<string, string>>
{
    public override Dictionary<string, string> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType == JsonTokenType.StartArray)
        {
            var dict = new Dictionary<string, string>();
            while (reader.Read())
            {
                if (reader.TokenType == JsonTokenType.EndArray) return dict;
                if (reader.TokenType == JsonTokenType.PropertyName)
                {
                    string propName = reader.GetString();
                    if (reader.Read()) dict.Add(propName, reader.GetString());
                }
            }
        }
        return null;
    }

    public override void Write(Utf8JsonWriter writer, Dictionary<string, string> value, JsonSerializerOptions options)
    {
        throw new NotImplementedException();
    }
}

public class TestClass
{

[System.Text.Json.Serialization.JsonConverter(typeof(ToDictConverter))]
public Dictionary<string, string> SimpleArray { get; set; }

}

相关问题