【问题标题】:JSON.NET Error reading JObjectJSON.NET 读取 JObject 时出错
【发布时间】:2026-01-29 17:05:01
【问题描述】:

我通过 AJAX 和 Web Api 将 JSON 对象发送到我的服务器:

var data = [
  ["fdsfsd", "Kifdsfa", "fsdfsa", "fadsf", "fasdfsd", "fadsf", "fasdfsd"],
  ["2008", "-5", "11", "12", "13"],
  ["2009", "20", "-11", "14", "13"],
  ["2010", "30", "15", "-12", "readOnly"]
];

$.ajax({
        url: '../webapi/Products',
        type: 'POST',
        dataType: "text", 
        data: "="+JSON.stringify( data ),
        success: function (test) {
                alert(test);
            },
            error: function (test) {
                alert("Error");
            }

所以我正在服务器上获取我想用 JSON.NET 解析的值:

public void Post([FromBody]string value )
{
      JObject o = JObject.Parse(@value);
}

这会引发异常:

Error reading JObject from JsonReader. Current JsonReader item is not an object:
StartArray. Path '', line 1, position 1.

为什么?这个值对我来说似乎是正确的?

【问题讨论】:

  • 您是否在服务器上打印 value 以检查语法是否正确?我猜,你得到的是一个 json 数组而不是一个 json 对象
  • 是的,它似乎是数组。所以没有办法将它转换为 JObject 对吗?我如何转换这个数组,例如到数据表?

标签: asp.net ajax json asp.net-web-api json.net


【解决方案1】:

只是看了一眼,我建议改变

data: "="+JSON.stringify( data ),

data: "myJSON="+JSON.stringify( data ),

...因为 jQuery 期望一个对象序列化,或者一个有效的查询字符串,然后监听那个发布的变量。我认为您不能只发布一堆数据而不将其分配为名称/值对的值。

【讨论】:

    【解决方案2】:

    json.stringify 将创建以下 json 字符串:

    [
      ["fdsfsd", "Kifdsfa", "fsdfsa", "fadsf", "fasdfsd", "fadsf", "fasdfsd"],
      ["2008", "-5", "11", "12", "13"],
      ["2009", "20", "-11", "14", "13"],
      ["2010", "30", "15", "-12", "readOnly"]
    ]
    

    这是一个 jsonArray 而不是一个 JsonObject。所以在服务器端你必须使用JArray a = JArray.Parse(@value);阅读它

    【讨论】: