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

B.B*_*dan -101 c# json dictionary key-value keyvaluepair

我正在使用WEB API接收来自客户端应用程序的请求以保存联系信息,我只需要在数据有错误时发送错误消息,否则没有TODO

我早期使用过字典

例如:

Dictionary<string, string> error = new Dictionary<string, string>
{
    {"SaveContactMethod_1", "FirstName Invalid"},
    {"SaveContactMethod_2", "LastName Invalid"},
    {"SaveContactMethod_3", "MiddleName Invalid"},
}
Run Code Online (Sandbox Code Playgroud)

相应的JSON对象是

{
    "error" : {
        "SaveContactMethod_1":"FirstName Invalid",
        "SaveContactMethod_2":"LastName Invalid",
        "SaveContactMethod_3":"MiddleName Invalid"
    }
}
Run Code Online (Sandbox Code Playgroud)

但我需要一个唯一的密钥(即重复键),所以我改变了Dictionary<string, string>List<KeyValuePair<string, string>>

List<KeyValuePair<string, string>> error = new List<KeyValuePair<string, string>>
{
    new KeyValuePair<string, string>("SaveContactMethod", "FirstName Invalid"),
    new KeyValuePair<string, string>("SaveContactMethod", "LastName Invalid"),
    new KeyValuePair<string, string>("SaveContactMethod", "MiddleName Invalid"),
}
Run Code Online (Sandbox Code Playgroud)

相应的JSON对象是

{
    "error" : [
        { "key":"SaveContactMethod", "value":"FirstName Invalid" },
        { "key":"SaveContactMethod", "value":"LastName Invalid" },
        { "key":"SaveContactMethod", "value":"MiddleName Invalid" }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我的要求:我需要添加一个Duplicate Key,我需要Json Output像Dictionary一样.请帮助我.

预期输出:JSON

{
    "error" : {
        "SaveContactMethod":"FirstName Invalid",
        "SaveContactMethod":"LastName Invalid",
        "SaveContactMethod":"MiddleName Invalid"
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*rdt 101

,这是不可能的.

这将是无效的*JSON:

{
    "error" : {
        "SaveContactMethod":"FirstName Invalid",
        "SaveContactMethod":"LastName Invalid",
        "SaveContactMethod":"MiddleName Invalid"
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里查看:

Warning:Duplicate key, names should be unique.[Code 23, Structure 9]
Warning:Duplicate key, names should be unique.[Code 23, Structure 13]
Run Code Online (Sandbox Code Playgroud)

*取决于您所称的有效

如果你真的想要走这条路,根据RFC 4627,你可以使用这个StringBuilder类.


既然你似乎不明白,那么取决于你所谓的有效意味着什么.

ECMA-262:

如果对象中存在重复的名称字符串,则应覆盖相同键的词法上先前的值.

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

  • @ B.Balamanigandan,要求是不可能的.如果您需要有关StringBuilder的帮助,请阅读文档.但这不是你应该这样做的方式,我不会为你写的.这将是广泛的方式.通过与提供要求的人交谈来更改要求.与这个人沟通为什么这是一个不好的要求.在这里参考你的问题.但这是我讨论的结束.对于那个很抱歉.我还有我需要完成的项目.也许其他人会编写符合您需求的解决方案.随意我的回答. (36认同)
  • 我不会删除这个答案. (34认同)
  • 只要您需要使用JSON programmaticaly @ B.Balamanigandan,您的要求就不会有任何意义.你真的应该使用一个简单的errorMessage字段,它是一个错误消息数组.那就是[xy](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)问题. (22认同)
  • 为了扩展这一点,重要的是要记住JSON代表一个*对象*.您无法在我知道的任何其他OO概念中创建具有重复属性名称的对象.当然它会编译没有错误(虽然有警告),但它实际上是不可用的. (16认同)
  • @Luminous_Dev真正让我最感兴趣的是这个世界上的API如何使用重复的密钥从JSON中生成一些东西...... (3认同)

rmu*_*unn 90

你有一个经典的"XY"问题.你问过"我怎么做X",但是你真的需要做Y而你认为X是到达Y的唯一方法 - 但X要么不可能要么非常难.通过稍微改变你的要求,你可以用不同的方式来到Y,但是你还没有看到它,因为你被困在X.

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

{
    "error" : {
        "SaveContactMethod":"FirstName Invalid",
        "SaveContactMethod":"LastName Invalid",
        "SaveContactMethod":"MiddleName Invalid"
    }
}
Run Code Online (Sandbox Code Playgroud)

正如其他人所说的那样,当你将它加载到C#代码中时,它将丢弃所有错误消息.

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

{
    "error" : {
        "SaveContactMethod": [
            "FirstName Invalid",
            "LastName Invalid",
            "MiddleName Invalid"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您只有一条错误消息,仍应使用列表:

{
    "error" : {
        "SaveContactMethod": [
            "FirstName Invalid"
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

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

这就是XY问题中的Y. 而不是在"我希望JSON中有重复键"的墙上敲打你的头,找到绕墙的方法:拥有一个带有值列表的单个键.现在,您可以执行您真正需要的操作,即从表单中获取所有错误消息,每个错误消息只需一个键名.