使用C#返回带有重复键的Json对象
我正在使用WEB API接收来自客户端应用程序的请求以保存联系信息,并且只有在数据有错误时我才需要发送错误消息,否则就没有任何问题
早期我使用过的词典
例如:
Dictionary<string, string> error = new Dictionary<string, string>
{
{"SaveContactMethod_1", "FirstName Invalid"},
{"SaveContactMethod_2", "LastName Invalid"},
{"SaveContactMethod_3", "MiddleName Invalid"},
}
相应的JSON对象是
{
"error" : {
"SaveContactMethod_1":"FirstName Invalid",
"SaveContactMethod_2":"LastName Invalid",
"SaveContactMethod_3":"MiddleName Invalid"
}
}
但我需要一个UNIQUE键(即重复键),所以我将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"),
}
相应的JSON对象是
{
"error" : [
{ "key":"SaveContactMethod", "value":"FirstName Invalid" },
{ "key":"SaveContactMethod", "value":"LastName Invalid" },
{ "key":"SaveContactMethod", "value":"MiddleName Invalid" }
]
}
我的要求 :我需要添加一个重复键,我需要像Dictionary一样的Json输出。 请帮助我。
预期输出:JSON
{
"error" : {
"SaveContactMethod":"FirstName Invalid",
"SaveContactMethod":"LastName Invalid",
"SaveContactMethod":"MiddleName Invalid"
}
}
所说的JSON是一种有效的格式:
在线工具#1:https://jsonformatter.curiousconcept.com/
在线工具#2:http://jsonformatter.org/
在线工具#3:http://www.freeformatter.com/json-validator.html
注意 :这个JSON只是为了阅读目的,我需要识别信息,形成它来的地方。 所以,我使用方法名称作为KEY。 没有解析器会读取这个JSON。 所以,没有问题。
不 ,这是不可能的。
这将是无效的* JSON:
{
"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]
*取决于你所称的有效
如果你真的想要走这条路线,根据RFC 4627,你可以使用StringBuilder
类。
既然你看起来不明白,那么根据你所说的有效含义而定。
ECMA-262:
在对象内存在重复的名称字符串的情况下,同一个关键字的词汇前面的值将被覆盖。
这意味着:如果你得到三个SaveContactMethod
,你只需要ECMA Script(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:
{
"error" : {
"SaveContactMethod": [
"FirstName Invalid",
"LastName Invalid",
"MiddleName Invalid"
]
}
}
如果您只有一条错误消息,则仍应使用列表:
{
"error" : {
"SaveContactMethod": [
"FirstName Invalid"
]
}
}
通过这种方式,当您将JSON加载到C#代码中时,它将始终具有相同类型的Dictionary<string,List<string>>
,无论是否存在一个或多个错误。
这是你XY问题中的Y. 不要在“我希望在JSON中有重复密钥”的墙上敲打你的头,而是要找到围绕墙的方法:使用一个带有值列表的键。 现在你可以做你真正需要的东西了,那就是从每一个错误信息中只用一个键名来获取表单中的所有错误信息。
链接地址: http://www.djcxy.com/p/37827.html