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

本文关键字:net HashSet 反序列化 JSON 对象 | 更新日期: 2023-09-27 18:07:56

下面是一个原始JSON数据的示例:

{ "Standards": { "1": "1" } }

我想将数据反序列化为:

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

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

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

注::我无法控制数据序列化过程

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

您可以使用自定义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