30

I have an object which I am de-serializing using ToJson<>() method from ServiceStack.Text namespace.

How to omit all the GET only propeties during serialization? Is there any attribute like [Ignore] or something that I can decorate my properties with, so that they can be omitted?

Thanks

kaya3
  • 47,440
  • 4
  • 68
  • 97
Hitesh.Aneja
  • 3,523
  • 3
  • 18
  • 14

2 Answers2

59

ServiceStack's Text serializers follows .NET's DataContract serializer behavior, which means you can ignore data members by using the opt-out [IgnoreDataMember] attribute

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

    public string Name { get; set; }

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

An opt-in alternative is to decorate every property you want serialized with [DataMember]. The remaining properties aren't serialized, e.g:

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

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

    public string IsIgnored { get; set; }
}

Finally there's also a non-intrusive option that doesn't require attributes, e.g:

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

Dynamically specifying properties that should be serialized

ServiceStack's Serializers also supports dynamically controlling serialization by providing conventionally named ShouldSerialize({PropertyName}) methods to indicate whether a property should be serialized or not, e.g:

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";
    }
}

More examples in ConditionalSerializationTests.cs

mythz
  • 141,670
  • 29
  • 246
  • 390
  • Option 1 looks best for my scenario. Thanks for quick help. – Hitesh.Aneja Feb 13 '13 at 20:50
  • 3
    I must say that the third option is amazing! :-) When you have to deal with code you can't change that's the way to go. I also find it enormously elegant. – Loudenvier Aug 14 '13 at 17:12
  • Yeah good detail provided. And 3rd option is cool as it provides runtime control. – Faisal Mq Jan 09 '14 at 07:42
  • 1
    [IgnoreDataMember] does not work with OrmLite, or did I miss something? – Erwin Mayer Mar 05 '14 at 19:34
  • 2
    @ErwinMayer Yeah it only applies to serialization. Use ServiceStack.DataAnnotations's [Ignore] attribute for OrmLite Data Models. – mythz Mar 05 '14 at 19:55
  • @mythz: Would be very helpful to support something like this: JsConfig.IgnoreReadOnlyProperties = true; – Kamarey Oct 23 '16 at 05:32
  • Sorry if this is common knowledge now, but I did discover that you can do this: JsConfig.IgnoreAttributesNamed = new[] { nameof(IgnoreAttribute) }; and that will let you use the same Ignore attribute you use for ORMLite. – Chris Bush Aug 08 '18 at 03:43
  • `ShouldSerialize()` doesn't receive the field name, it receives the JSON name, so if you use `DataMember` with `Name`, you have to supply that and keep track in both places. It would really be nice to have an attribute to specify incoming only or outgoing only. – Gábor Dec 03 '18 at 15:48
0

For nullable members, you also have the ability to set it to null before serializing.

This is particularly useful if you want to create a single view/api model that is re-used for several API calls. The service can touch it up before setting it on the response object.

Example:

    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;
    }

I do wish there was a way to dynamically control the serialization of all members (including non-nullable) on a per endpoint fashion.

Casey Plummer
  • 2,629
  • 23
  • 20