JSONConvert.Deserilize 对 JSON 对象值集合的扩展方法

Extension method for JSONConvert.Deserilize on collection of JSON object values

我有一种情况,我有 Json 个值作为字符串列表。

List<string> values = new List<string>()
{
    "{\"Id\":\"SC\",\"Value\":8563}",
    "{\"Id\":\"SC\",\"Value\":8563}",
    "{\"Id\":\"SC\",\"Value\":8563}"
};

如何反序列化为对象列表:

public class ClassA
{
   public string Id {get; set;}
   public int Value {get;set;}
}

var objectValues = JsonConvert.DeserializeObject<IEnumerable<ClassA>>(values);

我在传递值列表时无法反序列化,它需要一个字符串作为参数;我可以创建扩展方法还是有更简单的反序列化方法?

试试这个:

            List<ClassA> deserialized = new List<ClassA>();
            List<string> values = new List<string>()
            {   
                "{\"Id\":\"SC\",\"Value\":8563}",
                "{\"Id\":\"SC\",\"Value\":8563}",
                "{\"Id\":\"SC\",\"Value\":8563}"
            };
            foreach (var item in values)
            {
                var objectValue = JsonConvert.DeserializeObject<ClassA>(item);
                deserialized.Add(objectValue);
            }

作为扩展:

 public static List<ClassA> ToClassA(this List<string> stringList)
    {
        List<ClassA> deserialized = new List<ClassA>();
        foreach (var item in stringList)
        {
            var objectValue = JsonConvert.DeserializeObject<ClassA>(item);
            deserialized.Add(objectValue);
        }
        return deserialized;
    }

通用扩展

public static List<T> ToList<T>(this List<string> stringList) where T : class
        {
            List<T> deserialized = new List<T>();
            foreach (var item in stringList)
            {
                var objectValue = JsonConvert.DeserializeObject<T>(item);
                deserialized.Add(objectValue);
            }
            return deserialized;
        }

使用:

var result = values.ToList<ClassA>();

您可以通过构建新的 Jsonvalues 列表转换为 Arraystring,如以下代码:

var objectValues = JsonConvert.DeserializeObject<IEnumerable<ClassA>>($"[{string.Join(",", values)}]");

希望对您有所帮助。

public static PropertyBuilder<T> HasJsonConversion<T>(this PropertyBuilder<T> propertyBuilder,
    string columnType = null, string columnName = "", JsonSerializerSettings settings = null)
{
    var converter = new ValueConverter<T, string>(
        v => JsonConvert.SerializeObject(v, settings),
        v => JsonConvert.DeserializeObject<T>(v, settings));

    var comparer = new ValueComparer<T>(
        (l, r) => JsonConvert.SerializeObject(l, settings) == JsonConvert.SerializeObject(r, settings),
        v => v == null ? 0 : JsonConvert.SerializeObject(v, settings).GetHashCode(),
        v => JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(v, settings), settings));

    propertyBuilder.HasConversion(converter);
    if (columnType != null) propertyBuilder.HasColumnType(columnType);

    if (columnName == "")
        propertyBuilder.HasColumnName($"Json_{propertyBuilder.Metadata.Name}");
    else if (columnName != null)
        propertyBuilder.HasColumnName(columnName);

    propertyBuilder.Metadata.SetValueConverter(converter);
    propertyBuilder.Metadata.SetValueComparer(comparer);

    return propertyBuilder;
}