Изменить вывод ServiceStack.Text JSON Deserializer
Я в настоящее время использую Newtonsoft.json
пакет nuget, но я бы хотел найти более быструю альтернативу. ServiceStack.Text
кажется, разбирает его, но он возвращает JSON в другом формате, который я ожидаю. Есть ли в любом случае изменить формат, в котором это возвращает объект, чтобы соответствовать тому, что я ожидаю?
Проблема в том, что после десериализации, response.fullName
возвращает "Joey Cool", как и ожидалось Newtonsoft.json
но ServiceStack.Text
вернет null
потому что формат отличается.
Могу ли я изменить формат вывода ServiceStack.Text
так что это соответствует тому, что я ожидаю? Я хочу позвонить response.fullName
и получить "Джои круто".
Вот мой код, использующий ServiceStack.Text
составная часть:
T response = a_response.Content.FromJson<T>();
Вот мой код, используя Newtonsoft.json
:
T response = JsonConvert.DeserializeObject<T>(a_response.Content);
Ниже показано, как JSON в тексте выглядит как вывод:
{"userId": "fc7b4c4e0b6660c7daf711b1d17e0039", "emailAddress": "joey+100@stringify.com", "fullName": "joey cool", "accountType": "Individual", "creationDate": 1440104822411, "phoneNumber": "15555555555", "часовой пояс": "Америка /Los_Angeles", "фото": " https://stringify.s3.amazonaws.com/users/fc7b4c4e0b6660c7daf711b1d17e0039-profile.jpg ", "имя": "по умолчанию", тип " ": "api" }
Ниже показано, как отладчик показывает Newtonsoft.json
объект:
Ниже, как ваш ServiceStack.Text
JSON Deserializer показывает объект ответа:
---- РЕДАКТИРОВАТЬ ---- Пробовал 4.0.62 от NuGet, и это дает мне исключение.
Сообщение: инициализатор типа для 'ServiceStack.StringExtensions' вызвал исключение. Ссылка на объект не установлена на экземпляр объекта, в ServiceStack.StringExtensions..cctor () [0x00017] в: 0
-----РЕДАКТИРОВАТЬ-----
URL-адрес файла, содержащего класс JSON
Вот видео, демонстрирующее различия в использовании и странный вывод
1 ответ
Вы можете попробовать использовать последний v4 ServiceStack.Text, который теперь свободен от v4.0.62+ и доступен на всех платформах Xamarin.
С v3 в него было добавлено много улучшений, поэтому, если это поведение было результатом ошибки в v3, скорее всего, это исправлено.
Редактировать:
Этот класс, который вы пытаетесь сериализовать, недопустим, ServiceStack либо сериализует словари, либо классы POCO с открытыми свойствами, но не выполняет и то и другое, например:
[JsonObject (MemberSerialization.OptIn)]
public class UserDataDict : Dictionary<string, object>
{
[JsonProperty]
public string userID { get; set; }
[JsonProperty]
public string emailAddress { get; set; }
[JsonProperty]
public string fullName { get; set; }
[JsonProperty]
public string accountType { get; set; }
[JsonProperty]
public string units { get; set; }
[JsonProperty]
public string unitsDistance { get; set; }
[JsonProperty]
public string newsletterSub { get; set; }
[JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
public string location { get; set; }
[JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
public string phoneNumber { get; set; }
[JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
public string address { get; set; }
[JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
public string photo { get; set; }
[JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
public string createdDate { get; set; }
[JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
public string verifyURL { get; set; }
[JsonProperty (NullValueHandling = NullValueHandling.Ignore)]
public string timezone { get; set; }
[JsonProperty (NullValueHandling = NullValueHandling.Include)]
public APIManifestDict apiManifest { get; set; }
}
Я бы удалил Наследование словаря, так как гораздо эффективнее, чтобы ваш класс содержал словарь, а не наследовал от него. Также ваш [JsonProperty]
атрибуты специфичны для JSON.NET и не влияют на другие сериализаторы, поэтому я бы переписал ваш класс следующим образом:
public class UserData
{
public string userID { get; set; }
public string emailAddress { get; set; }
public string fullName { get; set; }
public string accountType { get; set; }
public string units { get; set; }
public string unitsDistance { get; set; }
public string newsletterSub { get; set; }
public string location { get; set; }
public string phoneNumber { get; set; }
public string address { get; set; }
public string photo { get; set; }
public string createdDate { get; set; }
public string verifyURL { get; set; }
public string timezone { get; set; }
public APIManifestDict apiManifest { get; set; }
public Dictionary<string,string> Metadata { get; set; }
}
Если вы хотите включить нули, вы можете указать это с помощью:
JsConfig.IncludeNullValues = true;
Но я бы не рекомендовал вашему приложению полагаться на наличие нулевых значений, поскольку ваши свойства, естественно, равны нулю, если они не включены в полезную нагрузку JSON. Включение нулей является более хрупким, оно должно учитывать множество определений пустоты, запрещает управление версиями и просто раздувает полезную нагрузку.