我需要一个好的设计来解决这个问题。
每次调用Web API时,我都会收到两个单独的JSON
字符串。我们将其命名为recieve1
和recieve2
。我需要检查recieve1
和recieve2
的所有常用名称,如果它们具有相同的值。如果recieve2
中存在一些recieve1
中没有的名称值对,那么就可以了(反之亦然)。但我不知道json字符串的名称值对。因为每次我打电话给api,我都可以获得新的JSON
对。例如,在第一次通话时我可以得到这个
recieve1
:
{
"employees": [
{
"firstName": "John",
"lastName": "Doe"
},
{
"firstName": "Anna",
"lastName": "Smith"
},
{
"firstName": "Peter",
"lastName": "Jones"
}
]
}
recieve2
:
{
"employees": [
{
"firstName": "John",
"lastName": "Doe",
"Sex": "Male"
},
{
"firstName": "Anna",
"lastName": "Smith"
},
{
"firstName": "Peter",
"lastName": "Jones",
"age": "100" // recieve1 does not have this name value pair
// But that is Ok they are still equivalent
}
]
}
根据我的要求,这两个是“等同的”。让我们看一下等效JSON的另一个例子,在我们得到的第二个调用中,
recieve1
:
{"menu":
{
"id": "1",
"name": "Second Call Return",
"ReturnCanHaveArrays": {
"array": [
{"isCommon": "Yes", "id": "1"},
{"isCommon ": "Yes", "id": "4"},
{"isCommon": "No", "id": "100"}
]
}
}
}
recieve2
:
{"menu":
{
"id": "1",
"name": "Second Call Return",
"newProperty" : "This is not present in recieve1. But that is ok"
"ReturnCanHaveArrays": {
"array": [
{"isCommon": "Yes", "id": "1"},
{"isCommon ": "Yes", "id": "4"}
]
}
}
}
以上两个jsons也相同。但是下面两个不是:
recieve1
:
{"menu": {
"id": "1"
}}
recieve2
:
{"menu": {
"id": "10" // not equivalent.
}}
正如你所看到的,我无法确定属性设置。我怎么解决这个问题?
答案 0 :(得分:0)
如果您使用的是JSON.net,则这非常简单。
bool AreEquiv(JObject a, JObject b)
{
foreach (var prop in a)
{
JToken aValue = prop.Value;
JToken bValue;
if (b.TryGetValue(prop.Key, StringComparison.OrdinalIgnoreCase, out bValue))
{
if (aValue.GetType() != bValue.GetType())
return false;
if (aValue is JObject)
{
if (!AreEquiv((JObject)aValue, (JObject)bValue))
return false;
}
else if (!prop.Value.Equals(bValue))
return false;
}
}
return true;
}
此代码将遍历两个JObject
,比较非对象值并递归调用任何内部JObject
的此函数。如果在a
和b
中均未找到密钥,则会跳过该密钥。