Разобрать любой Json в пару значений ключа

Я попытался прочитать все запросы и ответы с помощью Fiddler, но в некоторых случаях я получаю данные запроса в виде JSON и хочу разобрать этот JSON на пару ключ-значение.

Я пробовал вот так

string requestPost = Utilities.UrlDecode(oSession.GetRequestBodyAsString());
Dictionary<string, string> jsonRequest = new Dictionary<string, string>();
jsonRequest = JsonConvert.DeserializeObject<Dictionary<string, string>>(requestPost);
dataGridViewFiddler.DataSource = jsonRequest;

Но это не сработало для меня.

это мой формат Json

{"entries":[{"http_response_code":200,"network_changed":false,"protocol":"QUIC","request_age_ms":112425,"request_elapsed_ms":27,"sample_rate":0.05,"server_ip":"216.58.197.78:443","status":"ok","url":"https://www.google-analytics.com/","was_proxied":false}],"reporter":"chrome"}

Теперь, если я использую динамический анализ этого json, он работает, но

введите здесь описание изображения


person Ravi Kanth    schedule 21.04.2017    source источник
comment
Расскажите, пожалуйста, как выглядит requestPost?   -  person Luke    schedule 21.04.2017
comment
@Luke requestpost может быть любым json..   -  person Ravi Kanth    schedule 21.04.2017


Ответы (2)


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

Вариант 1. Десериализация JSON в Dictionary работает только в том случае, если ваши данные соответствуют макету key/value. Таким образом, макет всегда должен быть таким:

{
    "key1": "value1",
    "key2": "value2"
}

Конечно, ваше значение также может быть списком. Тем не менее, основная компоновка остается прежней. Например:

{
    "key1": ["value1", "value2"],
    "key2": ["value3", "value4"]
}

Это вы можете просто десериализовать с помощью своего кода:

var dict = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(requestPost);

Вариант 2. если ваши JSON данные структурированы с использованием пользовательских имен данных, вам потребуется создать соответствующие модели. Хороший инструмент, который может направить вас на правильный путь, — json2csharp. Позвольте мне привести пример. Если это ваш JSON:

[{
    "Key": "MyKey",
    "Values": [{
        "First": "RandomValue",
        "Second": "RandomValue"
    }, {
        "First": "RandomValue",
        "Second": "RandomValue"
    }]
},
{
    "Key": "MyKey",
    "Values": [{
        "First": "RandomValue",
        "Second": "RandomValue"
    }, {
        "First": "RandomValue",
        "Second": "RandomValue"
    }]
}]

Тогда ваши соответствующие модели должны быть:

public class Value
{
    public string First { get; set; }
    public string Second { get; set; }
}

public class RootObject
{
    public string Key { get; set; }
    public List<Value> Values { get; set; }
}

И вы можете десериализовать его следующим образом:

var values = JsonConvert.DeserializeObject<List<RootObject>>(json);

В заключение вы можете либо убедиться, что ваши JSON данные структурированы как Dictionary с key/value парами. В этом случае вы можете напрямую десериализоваться в Dictionary. В противном случае вам придется создавать собственные модели, соответствующие вашим JSON данным. Используйте то, что лучше всего подходит для вас! Обратите внимание, что можно просто десериализовать случайные данные, но будет очень сложно убедиться, что ваш код может обрабатывать данные! См. ответ Люка о том, как это сделать.

person Jurjen    schedule 21.04.2017

Если вы хотите иметь возможность десериализовать любой JSON, то тип, который вам нужно десериализовать, будет просто dynamic, а не Dictionary<string, dynamic>, потому что это будет означать, что вам потребуется строковый ключ в вашем JSON. ..

Поэтому, чтобы десериализовать любой объект JSON, по запросу, вам нужно использовать код:

var json = JsonConvert.DeserializeObject(requestPost);

Принимая во внимание, что JSON может быть таким простым, как:

["bob", "fred"]

Который не будет соответствовать вашей модели, так как в вашем словаре нет ключа (строки).

person Luke    schedule 21.04.2017