【问题标题】:Cannot deserialize the current JSON array issue无法反序列化当前 JSON 数组问题
【发布时间】:2018-04-17 15:37:56
【问题描述】:

我正在尝试将来自 Web 服务的 JSON 响应放入可以传递给我的视图并显示结果的对象中。我似乎在反序列化 JSON 时遇到了一些问题。这是错误。

无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型“Project.Models.Order”,因为该类型需要 JSON 对象(例如 {"name":"value"})才能正确反序列化. 要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList),例如可以从 JSON 数组反序列化。 JsonArrayAttribute 也可以添加到类型中以强制它从 JSON 数组中反序列化。 路径'',第 1 行,位置 1。

我的控制器代码如下。

string url = @"URL of webservice here";

var returnValue = new WebClient().DownloadString(url);

var obj = JsonConvert.DeserializeObject<Order>(returnValue);

return View(obj);

这是我的看法。

@model Project.Models.Order

@foreach (var order in Model.sWorkOrderNumber)
{
    @Model.sWorkOrderNumber
}

这是返回的 JSON。

[{"ShipmentTrackingNUmbers":[{"sTrackingNumber":"Redacted"}],"dtDateShipped":"5/12/2017 12:00:00 AM","dSPRatedWeight":"41.0000","nMBTotalBoxes":"1","sShipToAddressLine2":"Redacted","sShipToCountry":"U.S.A.","sShipToZip":"Redacted","sShipToState":"Redacted","sShipToCity":"Redacted","sShipToAddressLine1":"Redacted","sShipToName":"Redacted","sServiceLevel":"GND","sInvoiceNumber":"","dtInvoiceDate":"","mInvoiceAmount":"","dtDateReceived":"5/8/2017 3:16:25 PM","sStudioCategory2":"","sStudioCategory1":"","sOrderSource":"Redacted","sCustomerComments":"Redacted","sCustomerOrderName":"Redacted","sWorkOrderNumber":"Redacted","sCustomerNumber":"Redacted"},{"ShipmentTrackingNUmbers":[{"sTrackingNumber":"Redacted"}],"dtDateShipped":"5/10/2016 12:00:00 AM","dSPRatedWeight":"3.0000","nMBTotalBoxes":"1","sShipToAddressLine2":"","sShipToCountry":"U.S.A.","sShipToZip":"Redacted","sShipToState":"Redacted","sShipToCity":"Redacted","sShipToAddressLine1":"Redacted","sShipToName":"Redacted","sServiceLevel":"GND","sInvoiceNumber":"","dtInvoiceDate":"","mInvoiceAmount":"","dtDateReceived":"5/2/2016 7:18:41 AM","sStudioCategory2":"","sStudioCategory1":"","sOrderSource":"Redacted","sCustomerComments":"Redacted","sCustomerOrderName":"Redacted","sWorkOrderNumber":"Redacted","sCustomerNumber":"Redacted"}]

编辑:添加订单型号代码

namespace Project.Models
{
public class Order
{
    public string ShipmentTrackingNUmbers
    {
        get;
        set;
    }
    public string dtDateShipped
    {
        get;
        set;
    }
    public string dSPRatedWeight
    {
        get;
        set;
    }
    public string nMBTotalBoxes
    {
        get;
        set;
    }
    public string sShipToAddressLine2
    {
        get;
        set;
    }
    public string sShipToCountry
    {
        get;
        set;
    }
    public string ShipToZip
    {
        get;
        set;
    }
    public string sShipToState
    {
        get;
        set;
    }
    public string sShipToCity
    {
        get;
        set;
    }
    public string sShipToAddressLine1
    {
        get;
        set;
    }
    public string sShipToName
    {
        get;
        set;
    }
    public string sServiceLevel
    {
        get;
        set;
    }
    public string sInvoiceNumber
    {
        get;
        set;
    }
    public string dtInvoiceDate
    {
        get;
        set;
    }
    public string mInvoiceAmount
    {
        get;
        set;
    }
    public string dtDateReceived
    {
        get;
        set;
    }
    public string sStudioCategory2
    {
        get;
        set;
    }
    public string sStudioCategory1
    {
        get;
        set;
    }
    public string sOrderSource
    {
        get;
        set;
    }
    public string sCustomerComments
    {
        get;
        set;
    }
    public string sCustomerOrderName
    {
        get;
        set;
    }
    public string sWorkOrderNumber
    {
        get;
        set;
    }
    public string sCustomerNumber
    {
        get;
        set;
    }
}
}

提前感谢您的帮助。 我已经尝试了各种方法来使其正确格式化并且无法使其正常工作。任何指导都会很棒。

【问题讨论】:

  • 你的模型是什么样的?
  • Order 对象长什么样子?
  • 请为您的型号添加代码Order
  • 我想你可能需要使用JsonConvert.DeserializeObject&lt;List&lt;Order&gt;&gt;(returnValue)

标签: c# asp.net json asp.net-mvc


【解决方案1】:

您的模型应该如下所示。注意ShipmentTrackingNUmbersList

class Shipment
{
    public List<ShipmentTrackingNUmbers> ShipmentTrackingNUmbers { get; set; }
    public string dtDateShipped { get; set; }
    public string dSPRatedWeight { get; set; }
    public string nMBTotalBoxes { get; set; }
    public string sShipToAddressLine2 { get; set; }
}

public class ShipmentTrackingNUmbers
{
    public string sTrackingNumber { get; set; }
}

现在您可以将returnValue 反序列化为发货列表

List<Shipment> shipments = JsonConvert.DeserializeObject<List<Shipment>>(returnValue);

【讨论】:

  • 这是正确答案。 OP的模型不正确,需要修复。
  • 谢谢您,您是正确的,我的型号不正确,这些物品可以有多个跟踪号码。现在我需要弄清楚如何修改视图以反映这些变化。再次感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2020-06-12
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多