2016-08-12 6 views
2

В настоящее время я использую пакет nuget Newtonsoft.json, но я бы хотел найти более быструю альтернативу. ServiceStack.Text, похоже, разобрал его, но он возвращает JSON в другом формате, который я ожидаю. Есть ли способ изменить формат, в котором это возвращает объект в соответствии с тем, что я ожидаю?Alter output of ServiceStack.Text JSON Deserializer

Проблема заключается в том, что после того, как десериализации, response.fullName возвращает «Joey круто», как ожидается Newtonsoft.json но ServiceStack.Text возвратит null, поскольку формат отличается.

Могу ли я изменить формат вывода ServiceStack.Text так, чтобы он соответствовал ожидаемому? Я хочу позвонить response.fullName и получить «joey cool».

Вот мой код, используя ServiceStack.Text компонент:

T response = a_response.Content.FromJson<T>(); 

Вот мой код, используя Newtonsoft.json:

T response = JsonConvert.DeserializeObject<T>(a_response.Content); 

Ниже приводится как JSON в тексте выглядит вывод:

{ "идентификатор пользователя": "fc7b4c4e0b6660c7daf711b1d17e0039", "EMAILADDRESS": "[email protected]", "FULLNAME": "Джоуи круто", " ВидСчета": "индивид", «createdDate ": 1440104822411, "PHONENUMBER": "15555555555", "часовой пояс": "Америка/Los_Angeles", "фото":" https://stringify.s3.amazonaws.com/users/fc7b4c4e0b6660c7daf711b1d17e0039-profile.jpg», "имя": "по умолчанию", "типа": "апи" }

Ниже, как отладчик показываетобъект: enter image description here

Ниже, как ваша ServiceStack.Text JSON десериализатор показывает объект ответа: enter image description here

---- EDIT ---- Попробовал 4.0.62 от NuGet и это дает мне исключение.

Сообщение: Инициализатор типа для «ServiceStack.StringExtensions» сделал исключение. Ссылка на объект не установлено на экземпляр объекта, на ServiceStack.StringExtensions..cctor() [0x00017] в: 0

enter image description here

----- ----- РЕДАКТИРОВАТЬ

URL to a file containing the JSON class

Here's a video demonstrating the usage differences and the strange output

ответ

1

Вы можете попробовать использовать последнюю v4 из ServiceStack.Текст which is now free from v4.0.62+ и составляет available in all Xamarin platforms.

У него было много улучшений, добавленных к нему с v3, поэтому, если это поведение было результатом ошибки в v3, скорее всего, он исправлен.

Edit:

Этот класс вы пытаетесь сериализации является недействительным, 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. Включение нулей является более хрупким, оно должно учитывать множественные определения пустоты, препятствует управлению версиями и просто раздувает полезную нагрузку.

+0

Когда я пытаюсь использовать 4.0.62 из NuGet, я получаю исключение. Это вопрос Хамарина? Я приложил больше подробностей об исключении выше. Сообщение: Инициализатор типа для «ServiceStack.StringExtensions» сделал исключение. Object Ref не установлен в экземпляр объекта в ServiceStack.StringExtensions..cctor() [0x00017] в <имя файла неизвестно>: 0 – LampShade

+0

Вам необходимо [инициализировать клиент] (https://github.com/ServiceStackApps/HelloMobile/ blob/master/README.md # initializing-pcl-client), если у вас еще нет – mythz

+0

Так что я получил эту работу, мне пришлось использовать ServiceStack.Client вместо стандартного. Но у меня все еще такая же проблема. JSON показывает неверно .... Он выводится в том же сломанном формате, что и компонент Xamarin. – LampShade

Смежные вопросы