priyanka.sarkar
priyanka.sarkar

Reputation: 26498

How can we hide a property in WebAPI?

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.

Upvotes: 24

Views: 33446

Answers (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.

Upvotes: 5

Varinder Singh Baidwan
Varinder Singh Baidwan

Reputation: 203

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;

Upvotes: 1

priyanka.sarkar
priyanka.sarkar

Reputation: 26498

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.

Upvotes: 40

rnofenko
rnofenko

Reputation: 9533

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.

Upvotes: 5

Robbie Tapping
Robbie Tapping

Reputation: 2556

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

Upvotes: 2

Related Questions