2016-05-14 4 views
0

Мне нужен хороший дизайн для решения этой проблемы.Проверьте, имеют ли два JSON одинаковые значения для их общих имен.

Я получаю две отдельные строки JSON каждый раз, когда я называю веб-API. Назовите их recieve1 и recieve2. Мне нужно проверить для все обычные имена из recieve1 и recieve2, если они имеют одинаковые значения. Если есть пара значений имени в recieve2, которых нет в recieve1, это нормально (и наоборот). Но я не знаю пары значений имени json-строк. Потому что я могу получить новую пару JSON каждый раз, когда я называю это api. Например, по первому зову я могу получить эту

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 
    } 
    ] 
} 

По моему требованию эти два «эквивалентны». Давайте посмотрим на другой пример эквивалентных JSONs, на втором вызове мы получаем, 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# (. Важный Необходимо использовать с #).
  • NET версия: не имеет значения
  • Пожалуйста, предложите лучшие проекты для решения этой проблемы.
  • При необходимости используйте любую технологию. Заранее спасибо

ответ

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, он пропускается.

Смежные вопросы