【问题标题】:Cannot deserialize the current JSON array (e.g. [1,2,3]) using aysnc Task无法使用异步任务反序列化当前 JSON 数组(例如 [1,2,3])
【发布时间】:2014-12-01 15:17:42
【问题描述】:

我正在尝试将多个表行发布到数据库中。该类是“PurchaseOrderDetail”我知道我需要反序列化 JSON,但我不知道如何使用异步任务 IHttpActionResult 方法来做到这一点。 错误信息

{"$id":"1","Message":"请求无效。","ModelState":{"$id":"2","newPurchaseOrderDetail":["无法反序列化当前JSON数组(例如 [1,2,3])转换为类型“TexasExterior.Models.PurchaseOrderDetail”,因为该类型需要 JSON 对象(例如 {\"name\":\"value\"})才能正确反序列化。\r\ n要修复此错误,请将 JSON 更改为 JSON 对象(例如 {\"name\":\"value\"})或将反序列化类型更改为数组或实现集合接口的类型(例如 ICollection、IList)例如可以从 JSON 数组反序列化的 List。也可以将 JsonArrayAttribute 添加到该类型以强制它从 JSON 数组反序列化。\r\nPath '',第 1 行,位置 1。"]}}

ApiController

  public async Task<IHttpActionResult> PostNewPurchaseOrderDetail([FromBody]PurchaseOrderDetail newPurchaseOrderDetail)
    {
        try
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            using (var context = new ApplicationDbContext())
            {
                context.PurchaseOrderDetails.Add(newPurchaseOrderDetail);
                await context.SaveChangesAsync();
                return CreatedAtRoute("PurchaseOrderDetailApi", new { newPurchaseOrderDetail.PurchaseOrderDetailId }, newPurchaseOrderDetail);
            }
        }
        catch (Exception ex)
        {
            return this.BadRequest(ex.Message);
        }
    }

JSON

[
    {
        "QBRFQLINESUPPLIERPARTNUMBER": "Panels",
        "QBRFQLINESUPPLIERQUOTENOTES": "Notes",
        "QBRFQGROUPCOMBINESIZES": 15,
        "QBRFQLINESUPPLIERQUOTEQTY": 150,
        "QBRFQLINESUPPLIERQUOTEUOM": "ft",
        "QBRFQLINESUPPLIERQUOTEUNITPRICE": 1542,
        "$$hashKey": "object:96"
    },
    {
        "QBRFQLINESUPPLIERPARTNUMBER": "Carpet",
        "QBRFQLINESUPPLIERQUOTENOTES": "Notes",
        "QBRFQGROUPCOMBINESIZES": 205,
        "QBRFQLINESUPPLIERQUOTEQTY": 845,
        "QBRFQLINESUPPLIERQUOTEUOM": "meter",
        "QBRFQLINESUPPLIERQUOTEUNITPRICE": 745893,
        "$$hashKey": "object:98"
    },
    {
        "QBRFQLINESUPPLIERPARTNUMBER": "Drywall",
        "QBRFQLINESUPPLIERQUOTENOTES": "Notes",
        "QBRFQGROUPCOMBINESIZES": 19,
        "QBRFQLINESUPPLIERQUOTEQTY": 45,
        "QBRFQLINESUPPLIERQUOTEUOM": "sheet",
        "QBRFQLINESUPPLIERQUOTEUNITPRICE": 8542,
        "$$hashKey": "object:100"
    }
]

角度

 //Post Purchase Order Detail
$scope.newPurchaseOrderDetail = {};
$scope.newPurchaseOrderDetail.PurchaseOrderId = $scope.newPurchaseOrder.PurchaseOrderId;
$scope.newPurchaseOrderDetail.PurchaseOrderDetailId = $scope.newPurchaseOrder.PurchaseOrderId;
$scope.addPurchaseOrderDetail = function () {
    var newPurchaseOrderDetail = $scope.newPurchaseOrderDetail;
    var index = 0;
    $scope.purchaseOrderDetailArray.forEach(function (newPurchaseOrderDetail) {
        console.log('purchaseOrderDetailArray #' + (index++) + ': ' + JSON.stringify(newPurchaseOrderDetail));
    });
    var data = JSON.stringify($scope.purchaseOrderDetailArray)
    PurchaseOrderDetailPost.post(data)
        .success(function () {
            toastr.success('Success!');
        }).error(function () {
            toastr.error('Error!');
        })

};

工厂

app.factory('PurchaseOrderDetailPost', function ($http) {
return {

    post: function (data) {
        return $http.post('/api/apiPurchaseOrderDetail/', data);
    }
   };
 })

更新

 public async Task<IHttpActionResult> PostNewPurchaseOrderDetail([FromBody]IEnumerable<PurchaseOrderDetail> newPurchaseOrderDetail)
    {
        try
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            using (var context = new ApplicationDbContext())
            {
                context.PurchaseOrderDetails.AddRange(newPurchaseOrderDetail);
                await context.SaveChangesAsync();
                return CreatedAtRoute("PurchaseOrderDetailApi", new { newPurchaseOrderDetail.PurchaseOrderDetailId }, newPurchaseOrderDetail);
            }
        }
        catch (Exception ex)
        {
            return this.BadRequest(ex.Message);
        }
    }

错误 我知道我关闭了,我不知道如何插入 PurchaseOrderDetailId

return CreatedAtRoute("PurchaseOrderDetailApi", new { newPurchaseOrderDetail.PurchaseOrderDetailId }, newPurchaseOrderDetail);

【问题讨论】:

  • 错误的哪一部分你不明白?您希望如何将数组放入该对象参数中?
  • 我不明白需要改变什么。我从来没有同时发布多条记录,所以我迷路了
  • 要么将单个对象作为您的请求传递,要么更改函数以接受数组或集合。
  • 如果您的 json 是 PurchaseOrderDetail 对象的序列化数组,则将您的参数更改为 IEnumerable&lt;PurchaseOrderDetail&gt;
  • 你能发布你发布的Json吗?

标签: c# json asp.net-web-api2


【解决方案1】:

这个错误通常是因为你发布了类似的东西

[{"foo":"bar"}]

什么时候你应该简单地发帖

{"foo":"bar"}

或者修改你的方法来接受你的类的数组:

public async Task<IHttpActionResult> PostNewPurchaseOrderDetail(
    [FromBody]IEnumerable<PurchaseOrderDetail> newPurchaseOrderDetails)
{
    // ...

确保您发布的 JSON 采用您期望的格式,例如 Fiddler


您的代码表明您只想发布一个 PurchaseOrderDetails,但您提供的 JSON 意味着您正在尝试发布多个。

您需要选择仅发布一个{...} 或修改您的方法,使其接受我上面提到的多个[{...}, {...}]

【讨论】:

  • 这取决于。它是如何发布的?
  • 所以您发布的 JSON 显示您正在尝试发送多个 PurchaseOrderDetails 实例。您要么只需要发布一个,要么更改您的班级以接受多个。
  • 我刚刚更新了。正确,我正在尝试发布多个实例。因此,如果我需要修改 JSON,它会在工厂/服务中吗?
  • 好吧,如果您要发布多个,则需要更改您的方法以接受多个。或者一次只发布一个!
  • 我应该将答案标记为正确并提出一个新问题吗?
猜你喜欢
  • 2014-03-20
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多