Проблема при десериализация JSON

300
08 марта 2017, 17:06

Использую RestSharp для отправки запроса на API Yandex, но почему-то переменная result не заполняется.

В переменной response четко виден JSON.

 public Result GetLangByString(string str)
        {
            var request = new RestRequest("/api/v1.5/tr.json/detect", Method.POST);
            request.Credentials = CredentialCache.DefaultCredentials;
            request.AddParameter("key", _key); 
            request.AddParameter("text", str);
            IRestResponse response = _restClient.Execute(request);
            RestSharp.Deserializers.JsonDeserializer deserializer = new RestSharp.Deserializers.JsonDeserializer();
            var result = deserializer.Deserialize<Result>(response);
            return result;
        }
       public class Result
       {
           public int code;
           public string lang;
       }

Если поля заменить на свойства, то все работает. Это какие-то особенности либы или так принято?

Answer 1

Конечно поля в данном случае будут игнорироваться при десериализации результата. Зависит это от конкретной имплементации метода десериализации. В библиотеке RestSharp этот метод выглядит так:

private void Map(object target, IDictionary<string, object> data)
{
        var objType = target.GetType();
        var props = objType.GetProperties().Where(p => p.CanWrite).ToList();
        foreach (var prop in props)
        {
            var type = prop.PropertyType;
            var name = prop.Name;
            var actualName = name.GetNameVariants(Culture).FirstOrDefault(n => data.ContainsKey(n));
            var value = actualName != null ? data[actualName] : null;
            if (value == null) continue;
            // check for nullable and extract underlying type
            if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
            {
                type = type.GetGenericArguments()[0];
            }
            prop.SetValue(target, ConvertValue(type, value), null);
        }
    }

Как видно из приведенного выше кода, метод получает с помощью рефлексии нужные свойства сконструированного объекта target типа T (в вашем случае это будет класс Result) и заполняет их нужными значениями из словаря.

Answer 2

Все верно! Никаких глюков нет! Вы можете менять лишь свойства! А поля это просто переменные, которые не ассоциируются как объекты класса и не обладают таким важным свойством как "ПРИВЯЗКА ДАННЫХ". Вот у вас ничего и не получается с "ПОЛЯМИ"...

READ ALSO
Обработка нажатия по ItemControl и определение по какому именно элементу был совершен клик. MVVM

Обработка нажатия по ItemControl и определение по какому именно элементу был совершен клик. MVVM

Всем доброго времени суток! Крик души! Осталось реализовать две фичи, но бьюсь над ними уже пару дней

274
Как можно параллельно использовать WebClient.DownloadString?

Как можно параллельно использовать WebClient.DownloadString?

Есть коллекция ссылок и нужно скачать файлы по данным ссылкам

187
Entity Framework некорректно обновляется запись

Entity Framework некорректно обновляется запись

Уже задавал вопрос здесьОн до сих пор актуален

257
c# кастомный компонент

c# кастомный компонент

Встречали ли вы кастомный компонент "трекбар" с несколькими ползунками, каждый из которых задает некий рендж значений?

267