-3

我有一个 JSON 字符串,其中包含一个复杂、嵌套的对象,并且将来可能会更改架构。我想将其交给 Web API,以便根据需要在内容协商管道中进行序列化。

有没有直接的方法可以做到这一点?我已经阅读了关于 SO 的其他答案,但它们只讨论了您事先知道所需架构的情况(例如,使用 反序列JsonConvert.DeserializeAnonymousType化)或者您知道要反序列化到的嵌套深度。

例如,假设我有以下字符串:

    @"{
      name: "Dan"
      children: [
         {
            name: 'Fred',
         },
         {
            name: 'Fannie',
            age: 30,
            children: {
                own: [
                    {name: "Barney"},
                    {name: "Angela"}
                ],
                adopted: {
                    {name: "Sven"}
                }            
            }  
        }
    }"

我不知道它的架构是什么,它可以随时更改,我只想能够通过适当的内容协商通过 web api 发送它。

我可以,JObject.Parse(...)但 web api 无法JObject正确处理 s。它会正确处理字典,但我似乎无法弄清楚如何使用 JSON.Net 反序列化任意嵌套深度的字典。

4

3 回答 3

0

正如他们的文档所述,Json.NET 可以直接从 JSON 转换为 XML。这是他们文档中的示例:

string json = @"{
  '?xml': {
    '@version': '1.0',
    '@standalone': 'no'
  },
  'root': {
    'person': [
      {
        '@id': '1',
        'name': 'Alan',
        'url': 'http://www.google.com'
      },
      {
        '@id': '2',
        'name': 'Louis',
        'url': 'http://www.yahoo.com'
      }
    ]
  }
}";

XmlDocument doc = (XmlDocument)JsonConvert.DeserializeXmlNode(json);
// <?xml version="1.0" standalone="no"?>
// <root>
//   <person id="1">
//   <name>Alan</name>
//   <url>http://www.google.com</url>
//   </person>
//   <person id="2">
//   <name>Louis</name>
//   <url>http://www.yahoo.com</url>
//   </person>
// </root>

因此,要么将 JSON 作为字符串(未修改)传递,要么根据请求的内容类型转换为 XML。

于 2014-08-29T20:52:15.640 回答
0

因此,经过长时间的调查,我设法将问题归结为:

  • XmlSerializer当指定 xml 的内容类型时,Web Api 默认使用(现在基本上放弃了)
  • XmlSerializer无法序列化JObjects
  • 没有将任意嵌套深度的 s 转换为字典的内置方法JObject(尽管执行此操作的自定义递归函数不会非常困难)。

所以解决这个问题的方法是实现你自己的 xml 格式化程序,它可以转换为字典或使用类似XSerializer的东西。这听起来很简单,但在相关的 30 分钟长的峰值中,我无法启动我的自定义格式化程序。

最后,我只是简单地删除了 xml 格式化程序,因为它对我的 api 并不是绝对必要的,而且比它的价值更麻烦。

于 2014-09-02T19:07:33.200 回答
-1

我通过将动态对象转换为List<Dictionary<string, object>>. 请澄清这是否是您需要的。

好的,在您更新问题后,很明显您甚至不需要将其序列化为字典。只需使用Json.NET(它内置在 WebApi 中,顺便说一句,它被用作默认的 JSON 序列化程序)。

另外,请确保您将来传递有效的 json

工作示例(WebApi2)

JSON有效负载

{
    "name": "Dan",
    "children": [
        {
            "name": "Fred"
        },
        {
            "name": "Fannie",
            "age": 30,
            "children": {
                "own": [
                    {
                        "name": "Barney"
                    },
                    {
                        "name": "Angela"
                    }
                ],
                "adopted": [
                    {
                        "name": "Sven"
                    }
                ]
            }
        }
    ]
}

代码

public class DefaultController : ApiController
{
    [Route, HttpGet]
    public IHttpActionResult Test()
    {
        var json = "{\"name\": \"Dan\",\"children\": [{\"name\": \"Fred\"},{\"name\": \"Fannie\",\"age\": 30,\"children\": {\"own\": [{\"name\": \"Barney\"},{\"name\": \"Angela\"}],\"adopted\": [{\"name\": \"Sven\"}]}}]}";

        var obj = JsonConvert.DeserializeObject(json);

        return Ok(obj);
    }
}

回复 在此处输入图像描述

于 2014-08-29T20:06:04.393 回答