.net 反序列化JsonConvert.DeserializeObject数组,但可以有一个对象[已关闭]

tp5buhyn  于 2023-01-27  发布在  .NET
关注(0)|答案(2)|浏览(255)

14小时前关门了。
Improve this question
我正在通过JSON从我的. net应用程序的API中使用一些调查数据。我已经从我的. net应用程序中的JSON文件创建了一个类。JSON有一个名为Response []的节点,它是一个数组-所以我的调查平台返回给我多个调查。当我返回两个或更多调查时,这非常有效(因为它是一个数组)。

var root = JsonConvert.DeserializeObject<SurveyJsonModel.Rootobject>(json);

然而,如果调查平台只返回一个调查,那么反序列化就会失败,我怀疑JSON没有返回数组。请参见所附的我从JSON创建的模型的屏幕截图。知道我是如何解决的吗?这样它既适用于一个记录,也适用于多个记录?也不会因为零个记录而失败。我怀疑我的模型需要更改,还是需要使用不同的反序列化方法
TIA

我收到的错误消息是:
请参见下面的错误消息:
发生序列化异常:无法将当前JSON对象(例如,{" name ":" value "})反序列化为类型"SurveyJsonModel + Response []",因为该类型需要JSON数组(例如,[1,2,3])才能正确反序列化。若要修复此错误,请将JSON更改为JSON数组(例如,[1,2,3]),或者更改反序列化的类型,使其成为可以从JSON对象反序列化的普通. NET类型(例如,不是像整数这样的基元类型,也不是像数组或列表这样的集合类型)。还可以将JsonObjectAttribute添加到该类型,以强制它从JSON对象反序列化。
这是我正在使用的类-我不确定在哪里添加构造函数

public class SurveyJsonModel
{

    public class Rootobject
    {
        public Xml xml { get; set; }
        public Responses Responses { get; set; }
    }

    public class Xml
    {
        public string version { get; set; }
    }

    public class Responses
    {
        public Response[] Response { get; set; }
    }

    public class Response
    {
        public string startDate { get; set; }
        public string endDate { get; set; }
        public string status { get; set; }
        public string ipAddress { get; set; }
        
    }
}

这是我的JSON字符串,返回一个结果,如果它返回两个调查,我的代码工作-但下面失败的一个记录,因为它不是一个数组
{"?xml ":{"@版本":"1.0 "},"响应":{"响应":{"开始日期":" 2023年1月26日10:13:16 ","结束日期":" 2023年1月26日10:13:29 ","状态":" 0 "," IP地址":" www.example.com "}}192.168.0.1"}}}

polhcujo

polhcujo1#

如果您使用的是.NET Core 3或更高版本,则可以尝试将Response属性的类型更改为JsonElement,并检查ValueKind属性以查看它是对象还是数组。

hgb9j2n6

hgb9j2n62#

你不需要任何定制的转换器,在这种情况下,我通常建议创建一个非常简单的JsonConstructor。

using Newtonsoft.Json;

var result = JsonConvert.DeserializeObject<Rootobject>(json);

public partial class Responses
{
    public Response[] Response { get; set; }

    [JsonConstructor]
    public Responses(JToken Response)
    {
        if (Response.GetType().Name == "JArray")
            this.Response = Response.ToObject<Response[]>();
        else
            this.Response = new Response[] { Response.ToObject<Response>() };
    }
    public Responses() { }
}

public class Rootobject
{
    [JsonProperty("?xml")]
    public Xml Xml { get; set; }
    public Responses Responses { get; set; }
}
public class Xml
{
    [JsonProperty("@version")]
    public string Version { get; set; }
}

相关问题