Ответ C # Rest в JSON десериализации для пользовательского объекта - PullRequest
0 голосов
/ 30 августа 2018

Я просмотрел множество постов по этому вопросу, и у меня все еще проблемы. Я использую Newtonsoft.Json и следующий код:

string url = @"https://https://someSite.com/indexes('myIndex')search=SEARCH_PHONES:";
string phoneNumber = "5550005555";
url += phoneNumber;

HttpWebRequest request = HttpWebRequest.CreateHttp(url);
request.Method = "GET";
request.Headers.Add("api-key", "####");
WebResponse response = request.GetResponse();
Stream imageStream = response.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader(imageStream, encode);
string s = readStream.ReadToEnd();

JObject joResponse = JObject.Parse(s);
JArray array = (JArray)joResponse["value"];
string customer = array[0].ToString();

Проблема в том, что массив возвращается как одна длинная строка. Как получить доступ к отдельным парам ключ / значение? Ниже приведен ответ, который я получаю:

{
"@odata.context": "https://someSite.com/indexes('myIndex')/$metadata#docs",
"value": [
    {
        "@search.score": 10.933167,
        "CUSTOMER_DIM_ID": "77049309",
        "SOURCE_CUSTOMER_ID": null,
        "PORTSTORE_ID": "0326_1448401",
        "FIRST_NM": "First Name",
        "LAST_NM": "Last Name",
        "ADDR_LINE_1": "133 Main St",
        "ADDR_LINE_2": null,
        "CITY": "MyCity",
        "STATE_CD": "IL",
        "POSTAL_CD": "99999",
        "COUNTRY": "United States",
        "EMAIL_ADDR": "myEmail@gmail.com",
        "BIRTH_DT": null,
        "PHONE": "5550005555",
        "GENDER_CD": "F",
        "SEARCH_EMAILS": [
            "myEmail@gmail.com"
        ],
        "SEARCH_PHONES": [
            "5550005555"
        ],
        "JUS_EMAIL_OPTIN": true,
        "JCA_EMAIL_OPTIN": true,
        "LCA_EMAIL_OPTIN": true,
        "JUS_DM_OPTIN": true,
        "JCA_DM_OPTIN": true,
        "LCA_DM_OPTIN": true,
        "MOBILE_OPTIN": false,
        "LIFETIME_REVENUE": "138.1800",
        "LIFETIME_UNITS": 7,
        "NTH_ORDER": 2,
        "FIRST_PURCHASE_DT": "2016-02-11T00:00:00Z",
        "LAST_PURCHASE_DT": "2016-02-19T00:00:00Z",
        "AVG_LAG": 8,
        "IsDeleted": false,
        "UPDATE_DT": "2016-02-19T00:00:00Z"
    }
]

}

У меня нет доступа для изменения ответа. Я пытался использовать json2sharp для создания объектов, а затем просто десериализовать, но он сказал, что «@ search.score» был недопустим, а также «@ odata.context». После того, как я закомментировал эти строки в своем коде на C #, он не десериализуется правильно (все равно null), мне нужно иметь возможность получить информацию о клиенте и присвоить ее своему пользовательскому классу.

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Не анализируйте вручную JSON, если у вас нет для этого веской причины.

Сделайте веб-запрос, используя предпочитаемый клиент (postman / dhcp / etc.), И скопируйте ответ. Затем создайте новый файл .cs и перейдите в меню «Правка» -> «Специальная прошивка» -> «Вставить Json как класс».

Отсюда вы должны получить в основном работающий POCO, который можно использовать для десериализации JSON с помощью Newtonsoft.Json.JsonConvert.Deserialize<Class>(responseJson).

Обратите внимание, что для newsonoft по умолчанию используется верблюд для свойств json. Поскольку ваши свойства не являются верблюжьими, вам необходимо явно указать имя свойства.

[JsonProperty("ID")]
public int ID { get; set; }
0 голосов
/ 30 августа 2018

Похоже, что вы делаете немного дополнительной работы здесь. Вместо

Stream imageStream = response.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
StreamReader readStream = new StreamReader(imageStream, encode);
string s = readStream.ReadToEnd();

До string s = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

Тогда вы можете сделать JsonConvert.DeserializeObject<MyType>(s), и это даст вам ваш объект.

Также в вашем объекте обязательно используйте соответствующие атрибуты сериализации везде, где ваши имена не совпадают, если вы, например, хотели определенный стиль именования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...