从JSON到C#的异常反序列化错误

时间:2018-07-09 22:26:42

标签: c# json

.Net Fiddle 1

我从外部API收到了一个JOSN,如下所示:

[{
    "assignedto": "MAIN STAFF",
    "createduser": "API-71",
    "departmentid": "1",
    "observations": [{
        "abnormalflag": "abnormal",
        "analytename": "HGB A1C",
        "value": "5"
    }],
    "pages": [],
    "priority": "2",
    "status": "REVIEW"
}]

我在Visual Studio中做了选择性粘贴,并获得了以下课程

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public string assignedto { get; set; }
    public string createduser { get; set; }
    public string departmentid { get; set; }
    public Observation[] observations { get; set; }
    public object[] pages { get; set; }
    public string priority { get; set; }
    public string status { get; set; }
}

public class Observation
{
    public string abnormalflag { get; set; }
    public string analytename { get; set; }
    public string value { get; set; }
}

反序列化时,出现以下错误

  

运行时异常(第24行):无法将当前JSON数组(例如[1,2,3])反序列化为类型“ Rootobject”,因为该类型需要JSON对象(例如{“ name”:“ value” })正确反序列化。

     

要解决此错误,可以将JSON更改为JSON对象(例如{“ name”:“ value”}),也可以将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList),例如可以从JSON数组反序列化的列表。还可以将JsonArrayAttribute添加到类型中,以强制其从JSON数组反序列化。   路径”,第1行,位置1。

C#代码

public static void Main(string[] args) 
{

    var json = @"[{
                    ""assignedto"": ""MAIN ST (HUB) STAFF"",
                    ""createduser"": ""API-7127"",
                    ""departmentid"": ""1"",
                    ""observations"": [{
                        ""abnormalflag"": ""abnormal"",
                        ""analytename"": ""HGB A1C"",
                        ""value"": ""5""
                    }],
                    ""pages"": [],
                    ""priority"": ""2"",
                    ""status"": ""REVIEW""
                }]";



    Rootobject resultObj = JToken.Parse(json).ToObject<Rootobject>();

}

我提到了类似Create a strongly typed c# object from json object with ID as the name之类的问题-但这是一个不同的问题。

有人知道如何解决此问题吗?另外,从JSON生成C#类的更好方法是什么?

注意:我还尝试了从http://json2csharp.com/获得的课程。这也很糟糕-Fidlle 2

2 个答案:

答案 0 :(得分:3)

我将使用Newtonsoft / Json转换并更改它:

Rootobject resultObj = JToken.Parse(json).ToObject<Rootobject>();

收件人:

using Newtonsoft.Json;
-- snip --
    var resultObj = JsonConvert.DeserializeObject<List<Class1>>(json);

    Console.WriteLine(resultObj.Count); // 1
    Class1 result = resultObj[0];
    Console.WriteLine(result.assignedto); // "MAIN ST (HUB) STAFF"

这将为您提供RootObject

的集合

如上述@JeffMeracdo所述-您正在提供一个对象集合,并试图将其解析为单个对象

答案 1 :(得分:1)

如@JeffMeracdo所述,请尝试以下操作:

List<Example> resultObj = JsonConvert.DeserializeObject<List<Example>>(json);

跟随 using 语句和软件包以及 Newtonsoft.Json Nuget软件包:

using Newtonsoft.Json;

课程:

public class Observation
{
    public string abnormalflag { get; set; }
    public string analytename { get; set; }
    public string value { get; set; }
}

public class Example
{
    public string assignedto { get; set; }
    public string createduser { get; set; }
    public string departmentid { get; set; }
    public List<Observation> observations { get; set; }
    public List<object> pages { get; set; }
    public string priority { get; set; }
    public string status { get; set; }
}