Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将JSON反序列化为对象时出错_C#_Json_Json.net - Fatal编程技术网

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

C# 将JSON反序列化为对象时出错,c#,json,json.net,C#,Json,Json.net,我需要转换从RESTAPI获得的JSON数据,并将它们转换为CSV进行一些分析。问题是JSON数据不一定遵循相同的内容,因此我无法定义映射类型。这已经成为一个挑战,占用了我太多的时间。我已经创建了一些代码,但它当然不工作,因为它在这一行抛出异常 var data = JsonConvert.DeserializeObject<List<object>>(jsonData); var data=JsonConvert.DeserializeObject(jsonData)

我需要转换从RESTAPI获得的JSON数据,并将它们转换为CSV进行一些分析。问题是JSON数据不一定遵循相同的内容,因此我无法定义映射类型。这已经成为一个挑战,占用了我太多的时间。我已经创建了一些代码,但它当然不工作,因为它在这一行抛出异常

var data = JsonConvert.DeserializeObject<List<object>>(jsonData);
var data=JsonConvert.DeserializeObject(jsonData);
错误是:

其他信息:无法反序列化当前JSON对象 (例如,{“名称”:“值”})转换为类型 'System.Collections.Generic.List'1[System.Object]”,因为 需要JSON数组(例如[1,2,3])才能正确反序列化

若要修复此错误,请将JSON更改为JSON数组(例如[1,2,3]),或更改反序列化类型,使其成为可以从JSON对象反序列化的正常.NET类型(例如,不是integer之类的基元类型,也不是数组或列表之类的集合类型)。还可以将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;
            }


        }
}
{
“数据”:[
{
“ID”:“5367AB140026875F707AB277501BFA”,
“名称”:“快乐计划-沟通流程/流程和效率”,
“对象代码”:“项目”,
“完成百分比”:100.0,
“计划完工日期”:“2014-08-22T17:00:00:000-0400”,
“计划开始日期”:“2014-05-05T09:00:00:000-0400”,
"优先":一,,
“项目竣工日期”:“2014-12-05T08:10:21:555-0500”,
“状态”:“CPL”
},
{
“ID”:“555f452900c8b845238716dd033cf71b”,
“名称”:“用户体验个性化智库和产品策略”,
“对象代码”:“项目”,
“完成百分比”:0.0,
“计划完工日期”:“2015-12-01T09:00:00:000-0500”,
“计划开始日期”:“2015-05-22T09:00:00:000-0400”,
"优先":一,,
“项目竣工日期”:“2016-01-04T09:00:00:000-0500”,
“状态”:“四月”
},
{
“ID”:“528B920020051AB208AEF09A4740B1FE9”,
“名称”:“SCL健康系统-完整Sitecore实施(任务组的SOW总计以计划小时为单位-此处不计费时间)”,
“对象代码”:“项目”,
“完成百分比”:100.0,
“计划完工日期”:“2016-04-08T17:00:00:000-0400”,
“计划开始日期”:“2013-11-04T09:00:00:000-0500”,
"优先":一,,
“项目完工日期”:“2013-12-12T22:30:00:000-0500”,
“状态”:“CPL”
}
]
}
名称空间业务逻辑
{
公共类JsonToCsv
{
公共字符串ToCsv(字符串jsonData、字符串datasetName)
{
var data=JsonConvert.DeserializeObject(jsonData);
DataTable=ToDataTable(数据);
StringBuilder结果=新建StringBuilder();
for(int i=0;i
尝试使用此类而不是对象

public class Datum
{
    public string ID { get; set; }
    public string name { get; set; }
    public string objCode { get; set; }
    public double percentComplete { get; set; }
    public string plannedCompletionDate { get; set; }
    public string plannedStartDate { get; set; }
    public int priority { get; set; }
    public string projectedCompletionDate { get; set; }
    public string status { get; set; }
}

public class RootObject
{
    public List<Datum> data { get; set; }
}
公共类数据
{
公共字符串ID{get;set;}
公共字符串名称{get;set;}
公共字符串对象代码{get;set;}
公共双百分比完成{get;set;}
公共字符串plannedCompletionDate{get;set;}
公共字符串plannedStartDate{get;set;}
公共int优先级{get;set;}
公共字符串projectedCompletionDate{get;set;}
公共字符串状态{get;set;}
}
公共类根对象
{
公共列表数据{get;set;}
}
更改为:

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

如果您的数据是动态的,请尝试动态列表:

using System.Web.Script.Serialization;

JavaScriptSerializer jss = new JavaScriptSerializer();
var d=jss.Deserialize<dynamic>(str);
使用System.Web.Script.Serialization;
JavaScriptSerializer jss=新的JavaScriptSerializer();
var d=jss.Deserialize(str);

由于您试图将对象类型反序列化为列表类型,因此它不会直接反序列化

您可以这样做:

var data = JsonConvert.DeserializeObject<ObjectDataList>(jsonData);
var rows = new List<DeserializedData>();

foreach (dynamic item in data)
{
    var newData = new DeserializedData();
    foreach (dynamic prop in item)
    {
         var row = new KeyValuePair<string, string>
         (prop.Name.ToString(), prop.Value.ToString());
         newData.Add(row);
    }
    rows.Add(newData);
}
var data=JsonConvert.DeserializeObject(jsonData);
var rows=新列表();
foreach(数据中的动态项)
{
var newData=new反序列化数据();
foreach(项目中的动态道具)
{
var行=新的KeyValuePair
(prop.Name.ToString(),prop.Value.ToString());
newData.Add(行);
}
添加(newData);
}
这里有新的课程

//class for key value type data

class DeserializedData
{
    List<KeyValuePair<string, string>> NewData = 
    new List<KeyValuePair<string, string>>();

    internal void Add(KeyValuePair<string, string> row)
    {
        NewData.Add(row);
    }
}


[DataContract]
class ObjectDataList
{
    [DataMember(Name ="data")]
    List<object> Data { get; set; }
    public IEnumerator<object> GetEnumerator()
    {
        foreach (var d in Data)
        {
            yield return d;
        }
    }
}
//键值类型数据的类
类反序列化数据
{
列表新数据=
新列表();
内部无效添加(KeyValuePair行)
{
NewData.Add(行);
var data = JsonConvert.DeserializeObject<dynamic>(jsonData);
var rows = new List<string>();

// Go through the overall object, and get each item in 
// the array, or property in a single object.
foreach (KeyValuePair<string, object> item in data)
{
    dynamic obj = item.Value;
    var row = "";

    // Perhaps add a check here to see if there are more
    // properties (if it is an item in an array). If not
    // then you are working with a single object, and each
    // item is a property itself.
    foreach (KeyValuePair<string, object> prop in obj)
    {
        // Very dummy way to demo adding to a CSV
        string += prop.Value.ToString() + ",";
    }

    rows.Add(string);
}
class Root
{
    public List<Dictionary<string, object>> Data { get; set;}
}
var data = JsonConvert.DeserializeObject<Root>(jsonData).Data;
foreach (var dict in data)
{
    foreach (var kvp in dict)
    {
        Console.WriteLine(kvp.Key + ": " + kvp.Value);
    }
    Console.WriteLine();
}
reader.ReadRootValueAsArray 
class Parent
{
    public object Data { get; set;}
}
var output = JsonConvert.DeserializeObject<Parent>(jsonData);