24

I have a model say under

public class Device
{        
        public int DeviceId { get; set; }
        public string DeviceTokenIds { get; set; }
        public byte[] Data { get; set; }
        public string FilePwd { get; set; }        
}

Now I have a ASP.net Web API where there is a POST method as under

[HttpPost]
[Route("AddDeviceRegistrations")]
public void InsertDeviceRegistrations(Device device)

If I expose the WebAPI, obviously all the fields will be available e.g.

{
  "DeviceId": 1,
  "DeviceTokenIds": "sample string 2",
  "Data": "QEBA",
  "FilePwd": "sample string 3"
}

What I want is that, whenever I expose my WebAPI, the DeviceID should not get expose. I mean I am looking for

{

      "DeviceTokenIds": "sample string 2",
      "Data": "QEBA",
      "FilePwd": "sample string 3"
}

Is it possible? If so how?

I can solve the problem by changing the function signature as

public void InsertDeviceRegistrations(string deviceTokenIds, byte[] data, string FilePwd).

But I wanted to know if it can be possible or not ? If so , how?

Thanks in advance.

priyanka.sarkar
  • 25,766
  • 43
  • 127
  • 173
  • have you seen http://stackoverflow.com/questions/19698844/how-to-use-shouldserializemembername-method-for-a-property-of-type-object – Shaun Wilde Jun 03 '15 at 03:37
  • You can use "internal" access specifier for "DeviceId" internal int DeviceId {get; set; } – m2pathan May 03 '19 at 06:48

5 Answers5

38

I just figured out

[IgnoreDataMember]
 public int DeviceId { get; set; }

The namespace is System.Runtime.Serialization

More information IgnoreDataMemberAttribute Class

Learnt something new today.

Thanks All.

priyanka.sarkar
  • 25,766
  • 43
  • 127
  • 173
5

There's good practice to use View Models for all GET/POST requests. In you case you should create class for receiving data in POST:

public class InsertDeviceViewModel
{        
    public string DeviceTokenIds { get; set; }
    public byte[] Data { get; set; }
    public string FilePwd { get; set; }        
}

and then map data from view model to you business model Device.

rnofenko
  • 9,198
  • 2
  • 46
  • 56
5

If you are using Newtonsoft.Json

you can hide the properties like this:

public class Product
{
    [JsonIgnore]
    public string internalID { get; set; };
    public string sku { get; set; };
    public string productName { get; set; };
}

and your serialized response will not include the internalID property.

2

The use of the Attribute [NonSerialized] on top of the Property stops its from being Serialized in the outputting JSON/XML .

public class Device
{        
        [NonSerialized]
        public int DeviceId { get; set; }

        public string DeviceTokenIds { get; set; }
        public byte[] Data { get; set; }
        public string FilePwd { get; set; }        
}
Robbie Tapping
  • 2,516
  • 1
  • 17
  • 18
1

If you want to hide the data member of Resonse class with null parameter. Go to your project WebApiConfig file residing in App_start folder, add the following code:

var jsonConfig = config.Formatters.JsonFormatter;
jsonConfig.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;