Search code examples
c#jsonjson.netjson-deserialization

Deserializing JSON when inner property names vary


I have JSON which looks something like this (external JSON beyond my control):

[
  {
    "currencies": {
      "KGS": {
        "name": "Kyrgyzstani som",
        "symbol": "с"
      }
    }
  },
  {
    "currencies": {
      "SOS": {
        "name": "Somali shilling",
        "symbol": "Sh"
      }
    }
  }
]

And I have a set of classes which I would like this JSON deserialized into

public class ParentClass
{
    public OuterClass Currencies { get; set; }
}

public class OuterClass
{
    //Inner property below needs to map to these changing prop names: "KGS", "SOS"
    public InnerClass Inner { get; set; }
}    

public class InnerClass
{
    public string Name { get; set; }
    public string Symbol { get; set; }
}

And Lastly, when I try to deserialize:

JsonConvert.DeserializeObject<IList<ParentClass>>(responseBody.Content);

It's not deserializing properly, because the it cannot map varying Property names to "Inner". Is there a way to handle this scenario?


Solution

  • Newtonsoft didn't seem to have any problem with it..

        public partial class Blah
        {
            [JsonProperty("currencies")]
            public Dictionary<string, Currency> Currencies { get; set; }
        }
    
        public partial class Currency
        {
            [JsonProperty("name")]
            public string Name { get; set; }
    
            [JsonProperty("symbol")]
            public string Symbol { get; set; }
        }
    

    And

    var blah = JsonConvert.DeserializeObject<Blah[]>(jsonString);
    

    enter image description here

    ..though it's probably worth noting I think you have your parent and outer the wrong way round if this json is just a fragment..

    enter image description here