【问题标题】:Extension method for JSONConvert.Deserilize on collection of JSON object valuesJSONConvert.Deserialize 对 JSON 对象值集合的扩展方法
【发布时间】:2020-06-15 02:53:16
【问题描述】:

我有一种情况,我将 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);

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

【问题讨论】:

  • 为什么要将每个对象存储在字符串数组中?为什么不保留原来的 JSON 数组结构呢?如果您无法做到这一点,那么您需要遍历 values 列表并反序列化每个单独的项目
  • “反序列化” JSON 的行为也意味着获取 string 并将其转换为具体对象。我不知道你为什么认为你可以反序列化已经是一个对象的东西
  • 其实现在想来,扩展方法跟这里有什么关系?
  • @maccettura 我在后端表中有 Json 值行,我从表中读取它们作为 Object 的集合,我需要将 Json 的集合反序列化为 ClassA 对象的集合。跨度>

标签: c# .net json jsonconvert


【解决方案1】:

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

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

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    试试这个:

                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>();
    

    【讨论】:

    • maccettura 一个用例的例子。
    • 是的,您已经使用扩展方法来解决这个问题,但我的意思是“扩展方法”是一个实现细节。它不需要解决问题。
    • @svladimirrc 非常感谢,我在表中有不同类型的 Json 值,并且每种类型我必须将一组相关的 Json 值放入一个集合中,然后将其反序列化以转换为该类类型的对象列表以执行某些操作,这就是为什么要保持其通用性我可能需要一个扩展方法,而您的回答对我有所帮助。我不知道为什么这个问题被否决了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2011-05-31
    • 1970-01-01
    • 2013-12-02
    • 2011-07-15
    相关资源
    最近更新 更多