C#REST字典DTO

C#REST字典DTO,c#,.net,json,deserialization,dto,C#,.net,Json,Deserialization,Dto,为RESTAPI设计DTO以获取语义上为字典的资源的最佳方法是什么 示例:按年龄获取员工数量->应返回一组类型为(int,int)的夫妇(年龄,数量) 简单的方法应该是一组结构,如: [ { age: 30, number: 3 }, { age: 31, number: 4 }, { age: 32, number: 5 } ] 但这并不强制要求密钥必须是唯一的。 从语义上

为RESTAPI设计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#
中,它只是一本
字典

您可以使用

var result=JsonConvert.DeserializeObject(文本);
var serialized=JsonConvert.serialized对象(
新词典{{“1”,2},{“3”,4});

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

{
    "30": 3,
    "31": 4,
    "32": 5
}
c#
中,它只是一本
字典

您可以使用

var result=JsonConvert.DeserializeObject(文本);
var serialized=JsonConvert.serialized对象(
新词典{{“1”,2},{“3”,4});
正如中所建议的,字典本机受的支持

下面是一个例子:

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}"
var result=JsonConvert.DeserializeObject(文本);
var serialized=JsonConvert.serialized对象(新字典{30,3},{31,4});
//此处序列化==“{\'30\':3,\'31\':4,\'32\':5}”
正如中所建议的,字典本机受的支持

下面是一个例子:

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}"
var result=JsonConvert.DeserializeObject(文本);
var serialized=JsonConvert.serialized对象(新字典{30,3},{31,4});
//此处序列化==“{\'30\':3,\'31\':4,\'32\':5}”

如果有用,则通过DynamicDictionary类(在命名空间中)在中支持此序列化。在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;
    }
专用静态动态字典(IDictionary dictionary)
{
DynamicDictionary结果=新建DynamicDictionary();
foreach(字典中的var对)
{
添加(pair.Key.ToString(CultureInfo.InvariantCulture)、pair.Value);
}
返回结果;
}

如果有用,则通过DynamicDictionary类(在命名空间中)在中支持此序列化。在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;
    }
专用静态动态字典(IDictionary dictionary)
{
DynamicDictionary结果=新建DynamicDictionary();
foreach(字典中的var对)
{
添加(pair.Key.ToString(CultureInfo.InvariantCulture)、pair.Value);
}
返回结果;
}

无需将键转换为字符串:请参见@starnutodiopo您的示例中确实有字符串键,当然可以是int-int-dictionary,但在json中您有字符串键和int-value这是json语法:您不能有无引号的数字键!数字键必须被引用!看看json规范!不管怎么说,Json.Net也用引号将其序列化:尝试to Believen建议的示例,无需执行键到字符串的转换:请参阅@Starnutoditopo您的示例中确实有字符串键,请确保它可以是int-Dictionary,但是在json中有字符串键和int值这是json语法:不能有无引号的数字键!数字键必须被引用!看看json规范!无论如何,Json.Net也会用引号将其序列化:请尝试在上建议的示例