【问题标题】:How to return sorted dictionary from ASP.NET Web API如何从 ASP.NET Web API 返回排序字典
【发布时间】:2015-01-10 16:28:40
【问题描述】:

我有一系列键/值对,我想返回自定义排序(不是按键):

public IHttpActionResult GetStuff() {
    bla-bla-bla
    .ToDictionary(x => x.Code, x => x.Desc);
}

生成以下 JSON:

{
    "1": "ZZZ",
    "3": "AAA",
    "8": "CCC",
}

响应始终按键排序,因为据我了解 Dictionary<K, T> 不保证特定的排序。如果我返回一个排序列表 KeyValuePair<K, T> Web API 会产生另一个布局:

[
    { "Key": 3, "Value": "AAA"},
    { "Key": 8, "Value": "CCC"},
    { "Key": 1, "Value": "ZZZ"},
]

由于额外的有效负载,我不想要。那么如何返回一个类似于字典的键/值序列,其格式与第一个示例中的一样?

【问题讨论】:

    标签: .net sorting dictionary asp.net-web-api asp.net-web-api2


    【解决方案1】:

    您可以使用Select() 方法将字典的输出更改为特定的 ViewModel。示例:

    public class SourceViewModel
    {
       public string Key { get; set; }
       public string Value { get; set; }
    }
    

    您也可以使用Ok方法来响应200 http状态码,例如:

    public IHttpActionResult GetStuff() 
    {
        return Ok(source.Select(x => new SourceViewModel { Key = x.Code, Value = x => x.Desc})
                        .ToList());
    }
    

    【讨论】:

    • 这是未记录的约定吗?我的意思是具有Key/Value 属性的匿名对象?虽然这适用于 JSON.NET 序列化程序,但不适用于 XML(使用内容协商时):InvalidOperationException Type ...AnonymousType4'2... 无法序列化。
    • 我做了一些改变。您可以使用 ViewModel 使序列化工作。
    【解决方案2】:

    您应该使用这样的第二种格式(来自您的示例):

    [
        { "Key": 3, "Value": "AAA"},
        { "Key": 8, "Value": "CCC"},
        { "Key": 1, "Value": "ZZZ"},
    ]
    

    原因是 JSON 字典甚至没有排序的概念,这就像让汽车在水上航行一样不自然。您可能会想,“但我只需要在发送它们之前按正确的顺序获取它们”,但客户端将无法看到它的任何顺序。

    上面的示例将项目放入数组而不是字典中,并且数组确实有顺序,因为它们是一个列表。您不必担心额外的大小,因为这实际上已经非常有效。

    另一种方法是期望客户端根据读取所有 Key 字段对您的数据进行排序,但这通常不是发送有序数据的礼貌方式。

    【讨论】:

      猜你喜欢
      • 2018-01-02
      • 1970-01-01
      • 2015-01-05
      • 2016-04-23
      • 2016-03-16
      • 2018-07-17
      • 2016-12-17
      • 2016-10-14
      相关资源
      最近更新 更多