【问题标题】:JSON Serialization of URI Type in WebAPI 2 ODATA 3 C# ProjectWebAPI 2 ODATA 3 C# 项目中 URI 类型的 JSON 序列化
【发布时间】:2018-05-15 16:51:41
【问题描述】:

我在我的 WebAPI 2 项目中的 ODATA 3 控制器中看到 C# URI 类型序列化为 JSON 作为不包括域的段数组。我已经尝试了我能想到的一切来改变这一点(包括摆弄序列化设置,甚至尝试使用合同序列化程序而不是 JSON.Net)。似乎没有什么能改变这种行为。请注意,我没有使用 .Net Core。这是一个代码示例,浓缩成一个单一的 sn-p。

namespace WebApplication1.Controllers
{
    public class MyObject
    {
        public Uri Url { get; set; }

        public string Name { get; set; }

        public string ID { get; set; }
    }

    public class MyObjectsController : ODataController
    {
        private static ODataValidationSettings _validationSettings = new ODataValidationSettings();

        public IHttpActionResult GetMyObjects(ODataQueryOptions<MyObject> queryOptions)
        {
            try
            {
                queryOptions.Validate(_validationSettings);

                return Ok<IEnumerable<MyObject>>(new List<MyObject>() { new MyObject() { ID="asdf", Name="123rwe", Url = new Uri("http://www.webapp.com/sites/page.html") } });
            }
            catch (ODataException ex)
            {
                return BadRequest(ex.Message);
            }
        }

    }
}

这会在浏览器中生成以下 JSON:

{
  "odata.metadata":"http://localhost:51607/odata/$metadata#MyObjects","value":[
    {
      "Url":{
        "Segments":[
          "/","sites/","page.html"
        ]
      },"Name":"123rwe","ID":"asdf"
    }
  ]
}

这就是我想要的(无需将 Url 属性更改为字符串):

{
  "odata.metadata":"http://localhost:51607/odata/$metadata#MyObjects","value":[
    {
      "Url":"http://www.webapp.com/sites/page.html","Name":"123rwe","ID":"asdf"
    }
  ]
}

有什么想法吗?

更新: 进一步的研究表明,WebAPI ODATA 中 URI 类型的序列化行为由 odataentityreferencelink 和 odataentityreferencelinkserializer 类控制。具体来说,URI 类型似乎转换为 odataentityreferencelink 类型,然后以我上面发布的方式序列化(作为不包括根域的段数组)。我仍然需要知道如何改变这种行为,但是这两个类的文档证明没有帮助。最后,我确认此问题并非特定于 JSON 输出格式。 XML/Atom 和 JSON 的序列化行为是相同的:URI 被分解为一个段数组。

【问题讨论】:

  • 不要将其更改为字符串,而是将其更改为自定义类。
  • 不太可行。这个例子是一个大型类库的一个小表示,其中许多使用 URI 类型。
  • 覆盖Url 的getter ?
  • 我正在进一步了解这一点,并将很快更新原始帖子。仍未解决。
  • 一个 uri 总是会被分解成段,因为它的类型。我相信你真的需要使用字符串。

标签: c# json asp.net-web-api2 odata


【解决方案1】:

MS Premier 支持对此提供了最终答案,我将在下面分享。

  1. 没有直接 JSON 序列化 URI 类型的选项,通常它会按照您在代码中观察到的那样被分解为段数组
  2. 正常情况下会淘汰域名
  3. 您可以选择创建一个从 JSONConverter 派生的自定义 URI 转换器,JSONConverter 是 Newtonsoft.Json 命名空间的一部分

【讨论】:

  • 好像没有触发JsonConverter
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多