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

Другие вопросы по тегам