1

I'm consuming a rest service but when I de serialize the JSON string it throws this exception? What does this exception mean?

Class

public class Product
{
    public string PROD
    {
        get { return prod; }
        set { prod = value; }
    }
    
    //Department Number
    [JsonProperty("DPID")]
    public int DPID
    {
        get { return dpid; }
        set { dpid = value; }
    }
    
    //Sub Department Number
    [JsonProperty("SDID")]
    public int SDID
    {
        get { return sdid; }
        set { sdid = value; }
    }
    
    //Category Number
    [JsonProperty("CGID")]
    public int CGID
    {
        get { return cgid; }
        set { cgid = value; }
    }
    
    //Sub Category Number
    [JsonProperty("SCID")]
    public int SCID
    {
        get { return scid; }
        set { scid = value; }
    }
    
    //Product Description
    [JsonProperty("PDSC")]
    public string PDSC
    {
        get { return pdsc; }
        set { pdsc = value; }
    }
    
    //Product Brand
    [JsonProperty("PBRN")]
    public string PBRN
    {
        get { return pbrn; }
        set { pbrn = value; }
    }
    
    //Season Code
    [JsonProperty("SESN")]
    public string SESN
    {
        get { return sesn; }
        set { sesn = value; }
    }
    
    //Issue Quantity
    [JsonProperty("IQTY")]
    public string IQTY
    {
        get { return iqty; }
        set { iqty = value; }
    }
    
    //Currency Code
    [JsonProperty("CURR")]
    public string CURR
    {
        get { return curr; }
        set { curr = value; }
    }
    
    //Selling Price
    [JsonProperty("SELL")]
    public decimal SELL
    {
        get { return sell; }
        set { sell = value; }
    }
    
    //Product SKU Code
    [JsonProperty("PSKU")]
    public string PSKU
    {
        get { return psku; }
        set { psku = value; }
    }
    
    //Product Size
    [JsonProperty("PSZE")]
    public string PSZE
    {
        get { return psze; }
        set { psze = value; }
    }
    
    //Product Colour
    [JsonProperty("PCOL")]
    public string PCOL
    {
        get { return pcol; }
        set { pcol = value; }
    }
    
    //Pre-pack Code
    [JsonProperty("PPCD")]
    public string PPCD
    {
        get { return ppcd; }
        set { ppcd = value; }
    }
    
    //Image URL
    public string IURL
    {
        get { return iurl; }
        set { iurl = value; }
    }        
    
    [JsonProperty("DPDS")]
    public string DPDS
    {
        get { return dpds; }
        set { dpds = value; }
    }
}
    

Consumer

This is what I use to consume the rest service and then it sends me a JSON string which I de serialize into an object of type Observable Collection called products.

public ObservableCollection<Product> products = new ObservableCollection<Product>();

public async Task<ObservableCollection<Product>> GetProducts()
{
    try
    {
        string uri = url + "/product;
        _client.Timeout = TimeSpan.FromSeconds(300);

        HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, uri);
        var response2 = await _client.SendAsync(message);

        if (response2.IsSuccessStatusCode)
        {
            var content = await response2.Content.ReadAsStringAsync();
            var prodlist = JsonConvert.DeserializeObject<ObservableCollection<Product>>(content);
            products = prodlist;
            return products;
        }
        else if (response2.StatusCode == HttpStatusCode.NotFound)
        {
            return products;
        }

        return products;
    }
    catch (JsonException ex)
    {
        throw ex;
    }
}

JSON String

The URI returns a large string of this format when called.

{
  "PROD": "5510B-BK        ",
  "DPID": 0,
  "SDID": 0,
  "CGID": 0,
  "SCID": 0,
  "SPID": 0,
  "PDSC": "5510B BLACK BOAT SHOE                             ",
  "PBRN": "Footwear Direct",
  "SESN": "2018  ",
  "IQTY": "Pair           ",
  "CURR": "ZAR",
  "SELL": 0,
  "PSKU": "5510B-BK            ",
  "PSZE": "12      ",
  "PCOL": "BK                                 ",
  "PPCD": "A     ",
  "DPDS": "None                     "
}

The exception I get

Exception Message

Please note that this is what it says when pulling a single product but the same thing happen when pulling all object the position is all that changes then.

Error converting value "{"PROD":"5510B-BK ","DPID":0,"SDID":0,"CGID":0,"SCID":0,"SPID":0,"PDSC":"5510B BLACK BOAT SHOE ","PBRN":"Footwear Direct","SESN":"2018 ","IQTY":"Pair ","CURR":"ZAR","SELL":0.0000,"PSKU":"5510B-BK ","PSZE":"12 ","PCOL":"BK ","PPCD":"A ","DPDS":"None "}" to type 'WarehouseProMobile.Models.Product'. Path '', line 1, position 427.

Solved

Turns out my rest API serialized to JSON and when the object was sent over the network the web server also serialized my object this made the string useless. Fixed this by adjusting the API to only send objects.

Community
  • 1
  • 1
Fatcatfats
  • 43
  • 1
  • 8

2 Answers2

0

This is your POCO:

public class Product
{
    public string PROD { get; set; }

    //Department Number
    [JsonProperty("DPID")]
    public int DPID { get; set; }


    //Sub Department Number
    [JsonProperty("SDID")]
    public int SDID { get; set; }

    //Category Number
    [JsonProperty("CGID")]
    public int CGID { get; set; }

    //Sub Category Number
    [JsonProperty("SCID")]
    public int SCID { get; set; }

    //Product Description
    [JsonProperty("PDSC")]
    public string PDSC { get; set; }


    //Product Brand
    [JsonProperty("PBRN")]
    public string PBRN { get; set; }


    //Season Code
    [JsonProperty("SESN")]
    public string SESN { get; set; }

    //Issue Quantity
    [JsonProperty("IQTY")]
    public string IQTY { get; set; }


    //Currency Code
    [JsonProperty("CURR")]
    public string CURR { get; set; }

    //Selling Price
    [JsonProperty("SELL")]
    public decimal SELL { get; set; }

    //Product SKU Code
    [JsonProperty("PSKU")]
    public string PSKU { get; set; }

    //Product Size
    [JsonProperty("PSZE")]
    public string PSZE { get; set; }

    //Product Colour
    [JsonProperty("PCOL")]
    public string PCOL { get; set; }

    //Pre-pack Code
    [JsonProperty("PPCD")]
    public string PPCD { get; set; }
    //Image URL
    public string IURL { get; set; }

    [JsonProperty("DPDS")]
    public string DPDS { get; set; }
}

Modify your action method to:

public async Task<ObservableCollection<Product>> GetProducts()
{
    try
    {
        string uri = url + "/product;
        _client.Timeout = TimeSpan.FromSeconds(300);

        HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, uri);
        var response2 = await _client.SendAsync(message);

        ObservableCollection<Product> products = new ObservableCollection<Product>();
        if (response2.IsSuccessStatusCode)
        {
            var content = await response2.Content.ReadAsStringAsync();
            Product product = JsonConvert.DeserializeObject<Product>(content);
            products.Add(product);
        }

        return products;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
Kunal Mukherjee
  • 5,775
  • 3
  • 25
  • 53
0

This is what I normally do:

I create a class that matches JSON attrs (try to use nullable where possible):

public class Testingo
{

    public class Obj
    {
        public string PROD { get; set; }
        public int? DPID { get; set; }
        public int? SDID { get; set; }
        public int? CGID { get; set; }
        public int? SCID { get; set; }
        public int? SPID { get; set; }
        public string PDSC { get; set; }
        public string PBRN { get; set; }
        public string SESN { get; set; }
        public string IQTY { get; set; }
        public string CURR { get; set; }
        public int? SELL { get; set; }
        public string PSKU { get; set; }
        public string PSZE { get; set; }
        public string PCOL { get; set; }
        public string PPCD { get; set; }
        public string DPDS { get; set; }
    }

}

And then, I would simply write:

var jsonisedObject = JsonConvert.DeserializeObject<List<Testingo.Obj>>(jsonStringHere);

change jsonStringHere to the string that contents your actual JSON data

You can ask Visual Studio to generate a JSON-ready class for you. Just copy the json data and then inside a class, click on Edit->Paste Special->Paste Json as classes!

Amir Hajiha
  • 836
  • 8
  • 20