当前位置: 首页 > 面试题库 >

将JSON反序列化为对象时出错

应子真
2023-03-14
问题内容

我需要转换从REST
API获得的JSON数据,并将其转换为CSV以便进行分析。问题在于JSON数据不一定遵循相同的内容,因此我无法定义映射类型。这已经成为一项挑战,占用了我太多时间。我已经创建了一些代码,但是由于它在此行上引发了异常,因此它当然不起作用

var data = JsonConvert.DeserializeObject<List<object>>(jsonData);

错误是:

附加信息:无法将当前JSON对象(例如{“ name”:“
value”})反序列化为类型’System.Collections.Generic.List`1
[System.Object]’,因为该类型需要JSON数组(例如[1 ,2,3])正确反序列化。

要解决此错误,可以将JSON更改为JSON数组(例如[1,2,3]),也可以更改反序列化类型,使其成为普通的.NET类型(例如,不像整数这样的原始类型,也不像这样的集合类型。可以从JSON对象反序列化的数组或列表)。还可以将JsonObjectAttribute添加到类型中,以强制其从JSON对象反序列化。

路径“数据”,第2行,位置10。

请让我知道该如何做。

数据示例就是这样,数据字段可以经常更改,例如第二天可以添加一个新字段,因此我没有创建一个.Net类来映射数据的自由。

{
  "data": [
    {
      "ID": "5367ab140026875f70677ab277501bfa",
      "name": "Happiness Initiatives - Flow of Communication/Process & Efficiency",
      "objCode": "PROJ",
      "percentComplete": 100.0,
      "plannedCompletionDate": "2014-08-22T17:00:00:000-0400",
      "plannedStartDate": "2014-05-05T09:00:00:000-0400",
      "priority": 1,
      "projectedCompletionDate": "2014-12-05T08:10:21:555-0500",
      "status": "CPL"
    },
    {
      "ID": "555f452900c8b845238716dd033cf71b",
      "name": "UX Personalization Think Tank and Product Strategy",
      "objCode": "PROJ",
      "percentComplete": 0.0,
      "plannedCompletionDate": "2015-12-01T09:00:00:000-0500",
      "plannedStartDate": "2015-05-22T09:00:00:000-0400",
      "priority": 1,
      "projectedCompletionDate": "2016-01-04T09:00:00:000-0500",
      "status": "APR"
    },
    {
      "ID": "528b92020051ab208aef09a4740b1fe9",
      "name": "SCL Health System - full Sitecore implementation (Task groups with SOW totals in Planned hours - do not bill time here)",
      "objCode": "PROJ",
      "percentComplete": 100.0,
      "plannedCompletionDate": "2016-04-08T17:00:00:000-0400",
      "plannedStartDate": "2013-11-04T09:00:00:000-0500",
      "priority": 1,
      "projectedCompletionDate": "2013-12-12T22:30:00:000-0500",
      "status": "CPL"
    }
 ]
}



namespace BusinessLogic
{
    public class JsonToCsv
    {

       public string ToCsv(string jsonData, string datasetName)
       {
          var data = JsonConvert.DeserializeObject<List<object>>(jsonData);
          DataTable table = ToDataTable(data); 
          StringBuilder result = new StringBuilder();

            for (int i = 0; i < table.Columns.Count; i++)
            {
                result.Append(table.Columns[i].ColumnName);
                result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
            }

            foreach (DataRow row in table.Rows)
            {
                for (int i = 0; i < table.Columns.Count; i++)
                {
                    result.Append(row[i].ToString());
                    result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
                }
            }

            return result.ToString().TrimEnd(new char[] {'\r', '\n'});

        }

        private DataTable ToDataTable<T>( IList<T> data )
            {
            PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
            DataTable table = new DataTable();
            for (int i = 0 ; i < props.Count ; i++)
                {
                PropertyDescriptor prop = props[i];
                table.Columns.Add(prop.Name, prop.PropertyType);
                }

            object[] values = new object[props.Count];
            foreach (T item in data)
                {
                for (int i = 0 ; i < values.Length ; i++)
                    {
                    values[i] = props[i].GetValue(item);
                    }

                table.Rows.Add(values);
                }

            return table;
            }


        }
}

问题答案:

真正的问题是,您尝试反序列化为,List<object>但是JSON实际上代表一个包含data属性的单个对象,该属性随后包含一个对象列表。这就是为什么您会收到此错误。Json.Net无法将单个对象反序列化为列表。我认为您真正想要做的就是定义一个这样的容器类:

class Root
{
    public List<Dictionary<string, object>> Data { get; set;}
}

然后像这样反序列化:

var data = JsonConvert.DeserializeObject<Root>(jsonData).Data;

然后,您将获得一个字典列表,其中每个字典代表JSON数组中的一项。字典键值对是每个项目中的动态值。然后,您可以像处理其他任何词典一样使用它们。例如,这是转储所有数据的方式:

foreach (var dict in data)
{
    foreach (var kvp in dict)
    {
        Console.WriteLine(kvp.Key + ": " + kvp.Value);
    }
    Console.WriteLine();
}

小提琴:https :
//dotnetfiddle.net/6UaKhJ



 类似资料:
  • 问题内容: 我在使用AJAX访问的Java服务器应用程序中有一个字符串。它看起来像以下内容: 当从服务器提取字符串时,是否有一种简单的方法可以将其转换为活动的JavaScript对象(或数组)?还是我必须手动拆分字符串并手动构建对象? 问题答案: 现代浏览器支持。 在不浏览器,您可以包括在库中。

  • 问题内容: 在C#中,我已经通过使用如下代码成功将匿名对象序列化为JSON … 但是,我以后想要做的是将JSON字符串反序列化为一个匿名对象。像这样 但是serializer.Deserialize()方法需要第二个参数,该参数是将反序列化到的对象的类型。 我试过了 但这会产生错误: 没有为’<> f__AnonymousType0`2 [[System.Int32,mscorlib,Versio

  • 问题内容: 我需要将Objective- C对象序列化和反序列化为JSON以存储在CouchDB中。人们是否有通用解决方案最佳实践的示例代码?我看了几个JSON框架,它们在NSDictionary / NSArray级别停止了。即,许多框架会将NSDictionary / NSArray序列化和反序列化为JSON。但是我仍然要做将NSDictionary转换为Objective-C对象的工作。 为

  • 问题内容: 我有由第三方编码为固定长度数组的json’ed 元组数组: 我想使用json魔术来获取的实例列表 请帮助我放置适当的注释,以使ObjectMapper发挥作用。 我无法控制传入的格式,而我所有的google’n都以答案来回答如何将适当的json对象(而非数组)数组映射到对象列表 问题答案: 添加以下注释: 并且它应该根据需要序列化条目。 另外:然后使用它来强制执行特定顺序是最安全的,因

  • 问题内容: 我的JSON有点弱,所以我需要一些帮助。 我正在尝试反序列化用户的JSON: 放入我用属性装饰的对象中: 我得到以下异常: Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需的属性’user_id’。 这是因为JSON对象是一个数组吗?如果是这样,如何将其反序列化为一个User对象? 提前致谢! 问题答案: 正如Alexandr

  • 问题内容: 我想知道如何让Jackson JSON库将JSON反序列化为现有对象?我试图找到如何做到这一点。但它似乎只能接受一个Class并实例化它本身。 或者,如果不可能,我想知道是否有任何Java JSON反序列化库都可以做到。 对于C#,这似乎是一个相应的问题:将数据从JSON字符串覆盖到现有对象实例。似乎JSON.NET具有PopulateObject(string,object)。 问题