C# 使用C返回带有重复键的Json对象#

C# 使用C返回带有重复键的Json对象#,c#,json,dictionary,key-value,keyvaluepair,C#,Json,Dictionary,Key Value,Keyvaluepair,我正在使用WEB API来接收来自客户端应用程序的请求,以保存联系人信息,并且仅当数据有错误时才需要发送错误消息,否则无需执行任何操作 早期我用字典 例如: Dictionary<string, string> error = new Dictionary<string, string> { {"SaveContactMethod_1", "FirstName Invalid"}, {"SaveContactMethod_2", "LastName Inv

我正在使用WEB API来接收来自客户端应用程序的请求,以保存联系人信息,并且仅当数据有错误时才需要发送错误消息,否则无需执行任何操作

早期我用字典

例如:

Dictionary<string, string> error = new Dictionary<string, string>
{
    {"SaveContactMethod_1", "FirstName Invalid"},
    {"SaveContactMethod_2", "LastName Invalid"},
    {"SaveContactMethod_3", "MiddleName Invalid"},
}
但是我需要一个唯一的键(即重复键),所以我将
字典
更改为
列表

我的需求:我需要添加一个重复的键,并且需要Json输出,就像字典一样。请帮助我

预期输出:JSON

{
    "error" : {
        "SaveContactMethod":"FirstName Invalid",
        "SaveContactMethod":"LastName Invalid",
        "SaveContactMethod":"MiddleName Invalid"
    }
}

,这是不可能的

这将是无效的*JSON:

{
    "error" : {
        "SaveContactMethod":"FirstName Invalid",
        "SaveContactMethod":"LastName Invalid",
        "SaveContactMethod":"MiddleName Invalid"
    }
}
您可以检查以下内容:

*

如果你真的想走这条路,根据RFC4627,你可以使用这个类


既然你似乎不明白,什么取决于你所谓的有效手段

如果对象中存在重复的名称字符串, 同一键的词汇上的前导值应被覆盖

这意味着:如果您得到三个
SaveContactMethod
,那么您只需要在ECMA脚本(JS)中使用
“MiddleName Invalid”
。使用c#序列化,这甚至是不可能的。您需要为它编写自己的JsonSerializer。

您有一个典型的“XY”问题。你问过“我怎么做X”,但你真的需要做Y,你认为X是到达Y的唯一途径——但X要么不可能,要么很难。通过稍微改变您的需求,您可以以不同的方式获得Y,但您还没有看到这一点,因为您一直停留在X上

这是您想要获得的X:JSON格式:

{
    "error" : {
        "SaveContactMethod":"FirstName Invalid",
        "SaveContactMethod":"LastName Invalid",
        "SaveContactMethod":"MiddleName Invalid"
    }
}
正如其他人所说,这将丢弃所有错误消息,只有当您将其加载到C#代码中时,才会出现一条错误消息

但是,有一种非常简单的方法可以获取所有错误消息。您只需更改JSON,您希望它看起来像this

{
    "error" : {
        "SaveContactMethod": [
            "FirstName Invalid",
            "LastName Invalid",
            "MiddleName Invalid"
        ]
    }
}
如果只有一条错误消息,则仍应使用列表:

这样,当您将JSON加载到C#代码中时,无论是一个错误还是多个错误,它都将始终具有相同的类型,
Dictionary


这就是XY问题中的Y。不要让你的头撞在“我想要JSON中有重复的键”的墙上,找到一种绕过这堵墙的方法:用一个键和一个值列表。现在你可以做你真正需要做的事情了,那就是从你的表单中获取所有错误消息,每个错误消息只需要一个键名。

多个
“SaveContactMethod”:“Foo”
甚至是有效的JSON,如果这就是你想要的?也许你需要和你的客户谈谈,并向他们解释这是一个愚蠢的要求,可能会带来各种各样的问题?几天后,我们将看到该公司另一位开发人员提出一个问题:“如何使用重复键解析JSON?我需要所有的值,但我的库只返回最后一个。“哦,好吧…。@B.Balamanigandan:我说的是一个可怜的家伙,他将不得不解析你正在创建的输出,而不是你。:-)任何时候你发现自己在说“我需要一个重复的密钥”“,我认为是时候重新考虑您的设计了。为了进一步扩展,请记住JSON代表一个对象,这一点很重要。在我所知道的任何其他OO概念中,都不能创建具有重复属性名的对象。确保编译时不会出现错误(尽管有警告),但它实际上是不可用的。我假设这里有效的意思是,只有json字符串的语法有效,表示打开和关闭操作正确。。。。etc@Luminous_Dev实际上,我在这里最好奇的是API是如何利用JSON的重复键来实现某些功能的……您的要求毫无意义,只要您需要使用JSON程序maticali@B.Balamanigandan。您确实应该使用一个简单的errorMessage字段,它是一个错误消息数组。这就是问题所在。@B.Balamanigandan,这个要求是不可能的。如果需要有关StringBuilder的帮助,请阅读文档。但你不应该这样做,我也不会为你写。这将是一条通向宽广的道路。通过与提出要求的人交谈来改变要求。与此人沟通为什么这是一个不好的要求。请参考您的问题。但我这部分讨论到此结束。很抱歉。我也有我的项目需要完成。也许其他人会写一个适合你需要的解决方案。请随意否决我的答案。这对我的生活总体上是有帮助的
{
    "error" : {
        "SaveContactMethod":"FirstName Invalid",
        "SaveContactMethod":"LastName Invalid",
        "SaveContactMethod":"MiddleName Invalid"
    }
}
Warning:Duplicate key, names should be unique.[Code 23, Structure 9]
Warning:Duplicate key, names should be unique.[Code 23, Structure 13]
{
    "error" : {
        "SaveContactMethod":"FirstName Invalid",
        "SaveContactMethod":"LastName Invalid",
        "SaveContactMethod":"MiddleName Invalid"
    }
}
{
    "error" : {
        "SaveContactMethod": [
            "FirstName Invalid",
            "LastName Invalid",
            "MiddleName Invalid"
        ]
    }
}
{
    "error" : {
        "SaveContactMethod": [
            "FirstName Invalid"
        ]
    }
}