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

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键(即重复键),所以我将Dictionary更改为List>

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]

*取决于您所谓的有效

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

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

ECMA-262:

In the case where there are duplicate name Strings within an object,
lexically preceding values for the same key shall be overwritten.

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


你有一个经典的"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#代码中时,它将始终具有相同的类型Dictionary>,无论是一个错误还是多个错误。

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