繁体   English   中英

C#REST字典DTO

[英]C# REST dictionary DTO

为REST API设计DTO以获得语义上为字典的资源的最佳方法是什么?

示例:按年龄获取雇员数量->应该返回一组类型(int,int)的夫妇(年龄,数量)。

一个简单的方法应该是一个结构数组,例如:

[
    {
      age: 30,
      number: 3
    },
    {
      age: 31,
      number: 4
    },
    {
      age: 32,
      number: 5
    }
]

但这并没有强制要求密钥应该唯一。 在语义上,我宁愿使用字典,例如:

{
    "30": 3,
    "31": 4,
    "32": 5
}

有没有一种方法可以在C#中定义这样的DTO,以便可以轻松地对其进行序列化/反序列化?

您的第二个Json无效,应如下所示:

{
    "30": 3,
    "31": 4,
    "32": 5
}

c#这只是一个Dictionary<string, int>

您可以使用Json.Net轻松进行反序列化/序列化

var result =JsonConvert.DeserializeObject<Dictionary<string, int>>(text);

var serialized = JsonConvert.SerializeObject(
             new Dictionary<string, int> { { "1", 2 }, {"3",4}});

正如建议马克西姆- simkin他的回答 ,词典都原生支持Json.Net

这是一个例子:

var result = JsonConvert.DeserializeObject<Dictionary<int, int>>(text);

var serialized = JsonConvert.SerializeObject(new Dictionary<int, int> { { 30, 3 }, { 31, 4}});

// here serialized == "{\"30\":3,\"31\":4,\"32\":5}"

如果有用,则在Nancy中通过DynamicDictionary类(在名称空间Nancy中)支持此序列化。 在NancyModule中,您可以创建如下模型:

        DynamicDictionary dynamicDictionary = ToDynamicDictionary(dictionary);
        return this
          .Negotiate
          .WithModel(dynamicDictionary)
          .WithStatusCode(HttpStatusCode.OK);

然后,您必须使用以下帮助程序方法将密钥转换为字符串:

private static DynamicDictionary ToDynamicDictionary(IDictionary<int, int> dictionary)
    {
        DynamicDictionary result = new DynamicDictionary();
        foreach (var pair in dictionary)
        {
            result.Add(pair.Key.ToString(CultureInfo.InvariantCulture), pair.Value);
        }

        return result;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM