Return Json object with Duplicate Keys using C#
我正在使用WEB API接收来自客户端应用程序的请求以保存联系信息,我只需要在数据有错误时发送错误消息,否则没有TODO
我早期使用过字典
例如:
1 2 3 4 5 6 | Dictionary<string, string> error = new Dictionary<string, string> { {"SaveContactMethod_1","FirstName Invalid"}, {"SaveContactMethod_2","LastName Invalid"}, {"SaveContactMethod_3","MiddleName Invalid"}, } |
相应的JSON对象是
1 2 3 4 5 6 7 | { "error" : { "SaveContactMethod_1":"FirstName Invalid", "SaveContactMethod_2":"LastName Invalid", "SaveContactMethod_3":"MiddleName Invalid" } } |
但我需要一个UNIQUE键(即重复键),所以我将
1 2 3 4 5 6 | 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"), } |
相应的JSON对象是
1 2 3 4 5 6 7 | { "error" : [ {"key":"SaveContactMethod","value":"FirstName Invalid" }, {"key":"SaveContactMethod","value":"LastName Invalid" }, {"key":"SaveContactMethod","value":"MiddleName Invalid" } ] } |
我的要求:我需要添加一个Duplicate Key,我需要Json Output像Dictionary一样。 请帮助我。
预期输出:JSON
1 2 3 4 5 6 7 | { "error" : { "SaveContactMethod":"FirstName Invalid", "SaveContactMethod":"LastName Invalid", "SaveContactMethod":"MiddleName Invalid" } } |
不,这是不可能的。
这将是无效的* JSON:
1 2 3 4 5 6 7 | { "error" : { "SaveContactMethod":"FirstName Invalid", "SaveContactMethod":"LastName Invalid", "SaveContactMethod":"MiddleName Invalid" } } |
你可以在这里查看:
1 2 | Warning:Duplicate key, names should be unique.[Code 23, Structure 9] Warning:Duplicate key, names should be unique.[Code 23, Structure 13] |
*取决于您所谓的有效 sub>
如果你真的想要走这条路,根据RFC 4627,你可以使用
既然你似乎不明白,那么取决于你所谓的有效意味着什么。
ECMA-262:
In the case where there are duplicate name Strings within an object,
lexically preceding values for the same key shall be overwritten.
这意味着:如果你得到三个
你有一个经典的"XY"问题。你问过"我怎么做X",但是你真的需要做Y而你认为X是到达Y的唯一方法 - 但X要么不可能要么非常难。通过稍微改变你的要求,你可以用不同的方式来到Y,但是你还没有看到它,因为你被困在X.
这是您的X:您想要获得的JSON格式:
1 2 3 4 5 6 7 | { "error" : { "SaveContactMethod":"FirstName Invalid", "SaveContactMethod":"LastName Invalid", "SaveContactMethod":"MiddleName Invalid" } } |
正如其他人所说的那样,当你将它加载到C#代码中时,它将丢弃所有错误消息。
但是,有一种非常简单的方法可以获取所有错误消息。您只需要更改您希望看起来像这样的JSON:
1 2 3 4 5 6 7 8 9 | { "error" : { "SaveContactMethod": [ "FirstName Invalid", "LastName Invalid", "MiddleName Invalid" ] } } |
如果您只有一条错误消息,则仍应使用列表:
1 2 3 4 5 6 7 | { "error" : { "SaveContactMethod": [ "FirstName Invalid" ] } } |
这样,当您将JSON加载到C#代码中时,它将始终具有相同的类型
这就是XY问题中的Y.而不是在"我希望JSON中有重复键"的墙上敲打你的头,找到一种绕墙的方法:拥有一个带有值列表的单个键。现在,您可以执行您真正需要的操作,即从表单中获取所有错误消息,每个错误消息只需一个键名。