无法将Newtonsoft.Json.Linq.JArray转换为Newtonsoft.Json.Linq.JToken。当我通过json时出错

时间:2014-03-05 12:02:22

标签: c# json json.net

我需要将已检查的复选框代码传递给JavaScript中的C#。我能够通过JSON发送代码。我的JSON值是JArray。我在标题中得到例外。

JSON:

{
  "Items": [
    "100066",
    "100067"
  ]
}

C#:

public ActionResult UpdateTransportRequests()       
{
    string json;
    using (var reader = new StreamReader(Request.InputStream))
    {
        json = reader.ReadToEnd();
    }

    JObject jo = (JObject)JsonConvert.DeserializeObject(json);

    string lineItems = jo.Value<string>("Items");

    RequestDataAccess rda = new RequestDataAccess();
    decimal reqId = decimal.Parse(lineItems);
    rda.ApproveReject_Request(reqId, "A", "");

    return Json(new { result = "success" });
}

客户端:

function approveAll(requestid) {
    var items = [];

    $('#grid tbody').find('input:checkbox:checked').each(function (index, item) {
        var rowIndex = $(this).closest('tr').index();
        items.push($('#grid tbody').find('tr:eq(' + rowIndex + ')').find('td:eq(1)').text().replace('TR-', ''));

    });
    $.ajax({
        type: "POST",
        url: '@Url.Action("UpdateTransportRequestsAll", "TransportRequest")',
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify({ "Items": items }),
        success: function (response) {
            alert(response.result);
        },
        dataType: "json"
    });
}

请帮我解决此错误。

3 个答案:

答案 0 :(得分:15)

在这种情况下,我认为JsonConvert.DeserializeObject是不适合使用的方法。有关从JArray转换为JToken的错误可能是因为DeserializeObject正在尝试直接反序列化为JObject,因为它无法在JObject上找到必填字段{1}}。

尝试使用JObject.Parse(json)获取dynamic个对象。之后您可以像这样使用它:

dynamic jo = JObject.Parse(json);
var items = jo.Items;
foreach(var item in items)
{
    string lineItem = (string) item;
    decimal reqId = decimal.Parse(lineItem);

    // Use as required
}

答案 1 :(得分:10)

它可以从JArray转换为List array.ToObject<List<TargetDataType>>();

答案 2 :(得分:1)

public ActionResult UpdateTransportRequests() 
{
    string json;

    using (var reader = new StreamReader(Request.InputStream))
    {
        json = reader.ReadToEnd();
    }

    dynamic jo = JObject.Parse(json);
    foreach (var item in jo.Items)
    {
        decimal reqId = (decimal)item;
        RequestDataAccess rda = new RequestDataAccess();
        rda.AllApproveReject_Request(reqId, "A", "");
    }
    return Json(new { result = "success" });
}