【问题标题】:Parsing JSON in C#在 C# 中解析 JSON
【发布时间】:2026-02-06 20:35:01
【问题描述】:

我有一个要发送到 c# 服务器的 JSON 字符串。它包括一个事件对象数组和一个关系对象数组。关系对象描述数据库表关系。

但是,我无法从服务器上的 JSON 获取数据。当我尝试以下操作时,服务器上不存在要脱轨的对象,并且 JSON.net 会引发解析错误:

// Both throw parse errors
JObject o = JObject.Parse(Request.Form.ToString());
JsonConvert.DeserializeObject<MobileEvents>(Request.Form.ToString());

JSON:

{
    "CreateEvents": {
        "Event": [
            {
                "Id": "1",
                "Subject": "Hire a Clown"
            }
        ],
        "Relationship": [
            {
                "Primary": "Table1",
                "Secondary": "Table2",
                "Field": [
                    {
                        "Table1Id": "1",
                        "Table2Id": [
                            "101"
                        ]
                    }
                ]
            },
            {
                "Primary": "Table1",
                "Secondary": "Table3",
                "Field": [
                    {
                        "Table1Id": "1",
                        "Table3Id": [
                            "200025"
                        ]
                    }
                ]
            },
            {
                "Primary": "Table1",
                "Secondary": "Table4",
                "Field": [
                    {
                        "Table1Id": "1",
                        "Table4Id": [
                            "3"
                        ]
                    }
                ]
            }
        ]
    }
}

【问题讨论】:

  • 哪个例外? The object doesnt exist to deserailize into 是什么意思?通常你访问你的.Form 中的一个键,比如this.Request.Form["myHiddenFieldNAME"] 来获取一个值
  • @Andreas 数据结构是在客户端创建的,它在服务器上不存在(这更有意义吗?)
  • @Kapil 这与我最初尝试的类似,不幸的是我使用的是 .net 3.5 并且没有动态对象
  • @CrimsonChin 啊-服务器上不存在该模型...?好吧,那么您将需要使用 json.net 的动态部分:)(您使用JObject.Parse...的方法)

标签: c# json json.net


【解决方案1】:

Request.Form.ToString() 会返回类似“a=1&b=3”的结果,这绝对不是您需要的。

如果您在提交表单时传递值,则可以使用Request.Form["your-key"] 来获取值。

如果您通过 http 正文传递值,则可以使用 new StreamReader(Request.InputStream).ReadToEnd() 获取整个 JSON 字符串。

【讨论】:

  • 流阅读器方法对我有用 - 这变成了在 MVC 中解析大量 json 对象的绝佳解决方案,它不尝试将它们作为参数传递给控制器​​,而是直接从请求的形式中读取.天才感谢!
【解决方案2】:

我认为你在获取过程中有一个错误......

不是

this.Request.Form.ToString(); // see http://*.com/questions/7065979/why-is-the-return-value-of-request-form-tostring-different-from-the-result-of for output

应该是

this.Request.Form["myInputNAME"].ToString();

重要 - 真正使用 input/select/...-元素的 name-属性

无论如何:我想鼓励你,使用例如。 &lt;asp:HiddenField runat="server" ID="foo" /&gt;。当您拥有服务器控件时,您可以通过在服务器端简单地执行 this.foo.Value 来访问其值,而在客户端您可以访问输入字段,如 document.getElementById('&lt;%= this.foo.ClientID %&gt;')

【讨论】:

  • 我想知道这些值是否应该在表单中。该对象是在客户端从表单值创建的,然后发布到服务器,所以我不确定此时输入/值对在哪里维护。
  • 哦,我的错误。应该这样......将json对象转换为字符串,例如JSON.stringifygithub.com/douglascrockford/JSON-js)(使用演示@*.com/a/912247/57508