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>();
您可以通过构建新的 Json
将 values
列表转换为 Array
的 string
,如以下代码:
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;
}
我有一种情况,我有 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>();
您可以通过构建新的 Json
将 values
列表转换为 Array
的 string
,如以下代码:
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;
}