无法使用asyncTask反序列化当前的JSON数组(例如[1,2,3])

时间:2014-12-01 15:17:43

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

我正在尝试将多个表行发布到数据库中。该课程是" PurchaseOrderDetail"我知道我需要反序列化JSON,但我不知道如何使用异步任务IHttpActionResult方法。 错误消息

  

{" $ id":" 1","消息":"请求无效。"," 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 \ n路由'',第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);

1 个答案:

答案 0 :(得分:2)

此错误通常是因为您发布了类似

的内容
[{"foo":"bar"}]

什么时候应该发布

{"foo":"bar"}

或修改您的方法以接受您的类的数组:

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

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


您的代码建议您只想发布一个PurchaseOrderDetails,但您提供的JSON暗示您尝试发布多个。

您需要选择仅发布一个{...}或修改您的方法,以便它接受许多[{...}, {...}],如上所述。