Member 14779968 Ответов: 1

Как получить список ключей и значений из json с помощью jcontainer для выполнения проверки?


В моем тестировании API я использую Jcontainer для преобразования ответа в Json.
Экс:
[Test]
public void GetUsersList()
{
    var response = us.UserList();
    JContainer jsonresponse = rh.ConvertResponseToJson(response);
}



Я пытаюсь выполнить следующую проверку против Json
Проверьте, присутствуют ли все ключи (если присутствуют все ключи в json, например id, timestamp, type и т. д..)


Вот мой json
[
  {
    "id": "aa0db615-d4cb-4466-bc23-0e0083002330",
    "timestamp": "2020-02-11T19:00:00-05:00",
    "type": 33554432,
    "info": "Full Synchronization request for all endpoints",
    "schedule": "once",
    "lastRun": null,
    "flags": 6,
    "creator": null,
    "isEditable": true,
    "location": 0,
    "duration": null
  },
  {
    "id": "70baa28c-e270-447b-b88a-20d30a9542db",
    "timestamp": "2020-02-11T19:00:00-05:00",
    "type": 33554432,
    "info": "Full Synchronization request for all endpoints",
    "schedule": "once",
    "lastRun": null,
    "flags": 6,
    "creator": null,
    "isEditable": true,
    "location": 0,
    "duration": null
  },



Here is my Convert respone to Json for reference 
<pre> public JContainer ConvertResponseToJson(HttpWebResponse response)
        {
            string localString;

            if (response.ContentEncoding.Contains("application/xml"))
            {
                // Convert the escaped Stream into an XML document.
                ConfigXmlDocument xmlDocument = new ConfigXmlDocument();
                xmlDocument.LoadXml(ConvertResponseStreamToString(response));

                // Now convert the properly-escaped JSON for the response into a JContainer
                localString = JsonConvert.SerializeXmlNode(xmlDocument);
            }
            else
                localString = ConvertResponseStreamToString(response);

            return JToken.Parse(localString) as JContainer;
        }


Что я уже пробовал:

На данный момент я создал модель Json, чтобы прочитать ее по индексу массива. Но я делаю mutiple assetions для того чтобы vaidate все ключи. Я хочу просто пройтись по ним. Вот что у меня есть до сих пор
var response = us.UserList();
    JContainer jsonresponse = rh.ConvertResponseToJson(response);
 var castedModel = Jsonresponse.ToObject<IList<Model>>();
            Assert.IsNotNull(castedModel[0].info);  //This is repeated I am trying to avoid this
          Assert.IsNotNull(castedModel[0].task);
           Assert.IsNotNull(castedModel[0].timestamp)

Richard MacCutchan

В чем же вопрос?

Member 14779968

Я пытаюсь выполнить следующую проверку по отношению к ответу Json.

1. Проверьте, что все ключи присутствуют в Json.
например: если ответ содержит идентификатор, метку времени, тип, информацию и т. д.. Попытка итерации через Json для достижения этой цели.

1 Ответов

Рейтинг:
0

Bohdan Stupak

Предполагая что вопрос заключается в имени получение значения свойства так же просто как это

var sut = ConvertResponseToJson(req);
if (sut is JArray)
{
	var firstElementId = ((JArray)sut)[0]["id"];                
} 
else
{
	var elementId = sut["id"];
}

Обратите внимание, что ваш ответ может быть массивом, как в Примере, поэтому я проверяю его.
Если вы хотите получить все ключи любого элемента массива
var items = ((JArray)sut).Children();
foreach (JObject child in items)
{
	var allKeys = child.Properties().Select(p => p.Name).ToList();
}


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


Member 14779968

Привет, Богдан, Да, я обновил вопрос о том, что я пытаюсь здесь сделать. Я создал класс модели, представляющий Json. Но вместо того, чтобы использовать несколько утверждений для проверки каждого ключа, я хочу выполнить цикл через json и проверить, присутствуют ли все ключи