将JSON对象反序列化为.NET HashSet

8
这里是一个原始的JSON数据示例:
{ "Standards": { "1": "1" } }

我想将数据反序列化为:

public class Model
{
    public HashSet<String> Standards { get; set; }
}

Standards字段实际上具有Dictionary<String, String>类型。不知何故,键和值总是相等的。由于类型不兼容,我正在寻找一种执行此字段的自定义反序列化的方法。

基于JSON.NET库的解决方案更可取。

P.S.:我无法控制数据序列化过程。


如果所需的功能不存在,您可以随时编写自己的 JsonConverter 并使用 JsonConverterAttribute 标记属性。 - kiziu
你尝试过这样吗?JsonConvert.DeserializeObject<Model>(json); - M. Wiśnicki
1个回答

11

您可以使用自定义的JsonConverter来处理此问题。以下是所需的代码:

public class CustomHashSetConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(HashSet<string>);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        return new HashSet<string>(jo.Properties().Select(p => p.Name));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        HashSet<string> hashSet = (HashSet<string>)value;
        JObject jo = new JObject(hashSet.Select(s => new JProperty(s, s)));
        jo.WriteTo(writer);
    }
}
为了使用转换器,请像这样在您的模型中添加一个[JsonConverter]属性:
public class Model
{
    [JsonConverter(typeof(CustomHashSetConverter))]
    public HashSet<string> Standards { get; set; }
}

然后,只需像平常一样进行反序列化,它应该可以正常工作:

Model model = JsonConvert.DeserializeObject<Model>(json);

这是一个往返演示: https://dotnetfiddle.net/tvHt5Y


1
如果名称和值不匹配,您可能希望让ReadJson抛出异常。以防万一您得到一个没有相同键和值的值。 - Scott Chamberlain
运行得非常顺利。谢谢。 - shadeglare
没问题。很高兴能帮忙。 - Brian Rogers
那么这个是什么意思:{ "标准": [ "1", "2", "3" ] } - Vinigas
1
@Vinigas 这个有什么问题吗?你不需要为这个JSON使用转换器,它已经与HashSet<string>兼容。https://dotnetfiddle.net/eCijSK - Brian Rogers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接