Как пропустить Получить только свойства в servicestack json serializer?

У меня есть объект, который я де-сериализую, используя метод ToJson<>() из пространства имен ServiceStack.Text.

Как пропустить все GET только при создании сериализации? Есть ли какой-либо атрибут типа [Ignore] или что-то, что я могу украсить своими свойствами, чтобы их можно было пропустить?

Спасибо

Ответ 1

Сериализаторы сериализации ServiceStack следуют за поведением сериализатора .NET DataContract, что означает, что вы можете игнорировать элементы данных с помощью атрибута opt-out [IgnoreDataMember]

public class Poco 
{
    public int Id { get; set; }

    public string Name { get; set; }

    [IgnoreDataMember]
    public string IsIgnored { get; set; }
}

Альтернативой выбора является украшение каждого свойства, которое вы хотите сериализовать с помощью [DataMember]. Остальные свойства не сериализуются, например:

[DataContract]
public class Poco 
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }

    public string IsIgnored { get; set; }
}

Наконец, есть также неинтрузивный параметр, который не требует атрибутов, например:

JsConfig<Poco>.ExcludePropertyNames = new [] { "IsIgnored" };

Динамическое определение свойств, которые должны быть сериализованы

Сериализаторы ServiceStack также поддерживают динамическое управление сериализацией, предоставляя условно названные методы ShouldSerialize({PropertyName}), чтобы указать, должно ли быть сериализовано или нет, например:

public class Poco 
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string IsIgnored { get; set; }

    public bool? ShouldSerialize(string fieldName)
    {
        return fieldName == "IsIgnored";
    }
}

Другие примеры в ConditionalSerializationTests.cs

Ответ 2

Для членов с нулевым значением у вас также есть возможность установить его значение null до сериализации.

Это особенно полезно, если вы хотите создать единую модель view/api, которая повторно используется для нескольких вызовов API. Служба может коснуться его, прежде чем устанавливать его на объект ответа.

Пример:

    public SignInPostResponse Post(SignInPost request)
    {
        UserAuthentication auth = _userService.SignIn(request.Domain, true, request.Username, request.Password);

        // Map domain model ojbect to API model object. These classes are used with several API calls.
        var webAuth = Map<WebUserAuthentication>(auth);

        // Exmaple: Clear a property that I don't want to return for this API call... for whatever reason.
        webAuth.AuthenticationType = null;

        var response = new SignInPostResponse { Results = webAuth };
        return response;
    }

Я бы хотел, чтобы был способ динамически контролировать сериализацию всех членов (включая не-nullable) с точки зрения каждой конечной точки.