【问题标题】:Cannot cast Newtonsoft.Json.Linq.JArray to Newtonsoft.Json.Linq.JToken. Error getting when I pass the json无法将 Newtonsoft.Json.Linq.JArray 转换为 Newtonsoft.Json.Linq.JToken。当我传递 json 时出错
【发布时间】:2014-03-05 12:02:21
【问题描述】:

我需要将选中的复选框代码从 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"
    });
}

请帮我解决这个错误。

【问题讨论】:

  • 这就是错误?
  • 我没有看到将 JArray 转换为 JToken 的行...

标签: c# json json.net


【解决方案1】:

可以将JArray转换成List为array.ToObject&lt;List&lt;TargetDataType&gt;&gt;();

【讨论】:

  • 这正是我要找的
  • 这真的节省了我的时间。谢谢,伙计。
【解决方案2】:

在这种情况下,我认为JsonConvert.DeserializeObject 不适合使用。从JArray 转换为JToken 的错误可能是因为DeserializeObject 试图直接反序列化为JObject,这将失败,因为它在JObject 上找不到所需的字段。

尝试使用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
}

【讨论】:

  • @Vaithegi:如果这个答案对您有帮助,请不要忘记将您的问题标记为已回答。
【解决方案3】:
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" });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多