Deserialize Object with different key value

Viewed 145

I want to deserialize data from simple API but i have problem, since one keys can take different types of returned data:

I. First option - "value" key as simple object

"meta_data":{
  "id": 83487,
  "key": "_billing_invoice_ask",
  "value": "1"
}

II. Second option - "value" key as array

"meta_data":{
  "id": 83490,
  "key": "apaczka_delivery_point",
  "value": {
    "apm_access_point_id": "9993",
    "apm_supplier": "INPOST",
    "apm_name": "Parking",
    "apm_foreign_access_point_id": "NWJ01N",
    "apm_street": "Street name",
    "apm_city": "City",
    "apm_postal_code": "00-002",
    "apm_country_code": "PL"
  }
}

I create meta_data model and i want serialize data from API to this model

public class meta_data
{
  public int id { get; set; }
  public string key { get; set; }
  public string value { get; set; }
}

public class api_class{
  //some code responsible for getting data from api
  meta_data data = JsonConvert.DeserializeObject<meta_data>(response.Content);
}

When API return "value" as simple object everythink is ok, but if API return "value" as array i got error:

This exception was originally thrown at this call stack:
    Newtonsoft.Json.JsonTextReader.ReadStringValue(Newtonsoft.Json.ReadType)
    Newtonsoft.Json.JsonTextReader.ReadAsString()
    Newtonsoft.Json.JsonReader.ReadForType(Newtonsoft.Json.Serialization.JsonContract, bool)
    Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(object, Newtonsoft.Json.JsonReader, Newtonsoft.Json.Serialization.JsonObjectContract, Newtonsoft.Json.Serialization.JsonProperty, string)
    Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(Newtonsoft.Json.JsonReader, System.Type, Newtonsoft.Json.Serialization.JsonContract, Newtonsoft.Json.Serialization.JsonProperty, Newtonsoft.Json.Serialization.JsonContainerContract, Newtonsoft.Json.Serialization.JsonProperty, object)
    Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(Newtonsoft.Json.JsonReader, System.Type, Newtonsoft.Json.Serialization.JsonContract, Newtonsoft.Json.Serialization.JsonProperty, Newtonsoft.Json.Serialization.JsonContainerContract, Newtonsoft.Json.Serialization.JsonProperty, object)
    Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(System.Collections.IList, Newtonsoft.Json.JsonReader, Newtonsoft.Json.Serialization.JsonArrayContract, Newtonsoft.Json.Serialization.JsonProperty, string)
    Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(Newtonsoft.Json.JsonReader, System.Type, Newtonsoft.Json.Serialization.JsonContract, Newtonsoft.Json.Serialization.JsonProperty, object, string)
    Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(Newtonsoft.Json.JsonReader, System.Type, Newtonsoft.Json.Serialization.JsonContract, Newtonsoft.Json.Serialization.JsonProperty, Newtonsoft.Json.Serialization.JsonContainerContract, Newtonsoft.Json.Serialization.JsonProperty, object)
    Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(Newtonsoft.Json.Serialization.JsonProperty, Newtonsoft.Json.JsonConverter, Newtonsoft.Json.Serialization.JsonContainerContract, Newtonsoft.Json.Serialization.JsonProperty, Newtonsoft.Json.JsonReader, object)
    ...
    [Call Stack Truncated]

Actually, I only need the value of the field "value", if it's not an array (just a simple object). Therefore, I modified the model a bit:

public class meta_data
{
  public int id { get; set; }
  public string key { get; set; }
  public string value
  { 
    get
    {
      return value;
    } 
    set
    {
      if (value is not string)
      {
        this.value = "";
      };
    }
  }
}

However, I am getting the same error.

0 Answers
Related