代码之家  ›  专栏  ›  技术社区  ›  LCJ

从json到c的异常反序列化错误#

  •  0
  • LCJ  · 技术社区  · 7 年前

    .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”}),或将反序列化类型更改为数组或实现可从JSON数组反序列化的集合接口(例如ICollection、IList)类列表的类型。还可以将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 回复  |  直到 7 年前
        1
  •  3
  •   Jonathan    7 年前

    我将使用newtonsoft/json convert并更改以下内容:

    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所说的那样-您提供了一个对象集合,并试图将其解析为一个单独的对象

        2
  •  1
  •   Evandro de Paula    7 年前

    正如上面@jeffmeracdo所说,试试这个:

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

    跟随 使用 声明和包装 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; }
    }