检查两个JSON的公用名是否具有相同的值

时间:2016-05-14 13:54:49

标签: c# json

我需要一个好的设计来解决这个问题。

每次调用Web API时,我都会收到两个单独的JSON字符串。我们将其命名为recieve1recieve2。我需要检查recieve1recieve2所有常用名称,如果它们具有相同的值。如果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.
}}

正如你所看到的,我无法确定属性设置。我怎么解决这个问题?

  • 语言:c#(重要。必须使用c#)。
  • NET版:不重要
  • 请提出解决此问题的最佳设计。
  • 如有必要,请使用任何技术。 提前致谢

1 个答案:

答案 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的此函数。如果在ab中均未找到密钥,则会跳过该密钥。