Deserialize array of key value pairs using Json.NET

前端 未结 4 1277
南笙
南笙 2020-12-03 13:51

Given the following json:

[ {\"id\":\"123\", ... \"data\":[{\"key1\":\"val1\"}, {\"key2\":\"val2\"}], ...}, ... ]

that is part of a bigger

相关标签:
4条回答
  • 2020-12-03 14:16

    Thanks @Boo for your answer but in my case I needed to take some small adjustements. This is how my JSON looks like:

    {
        "rates": {
            "CAD": 1.5649,
            "CZK": 26,118,
            ...
        },
        "base": "EUR",
        "date": "2020-08-16"
    }
    

    And my DTO looks like the following:

    public IDictionary<string, decimal> Rates { get; set; }
    public string Base { get; set; }
    public DateTime Date { get; set; }
    

    So the only adjustement was to remove the IEnumerable around the IDictionary.

    0 讨论(0)
  • 2020-12-03 14:17

    I ended up doing this:

    [JsonConverter(typeof(MyCustomClassConverter))]
    public class MyCustomClass
    {
      internal class MyCustomClassConverter : JsonConverter
      {
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
          throw new NotImplementedException();
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
          JObject jObject = JObject.Load(reader);
    
          foreach (var prop in jObject)
          {
            return new MyCustomClass { Key = prop.Key, Value = prop.Value.ToString() };
          }
    
          return null;
        }
    
        public override bool CanConvert(Type objectType)
        {
          return typeof(MyCustomClass).IsAssignableFrom(objectType);
        }
      }
    
      public string Key { get; set; }
      public string Value { get; set; }
    }
    
    0 讨论(0)
  • 2020-12-03 14:17
    public class Datum
    {
        public string key1 { get; set; }
        public string key2 { get; set; }
    }
    
    public class RootObject
    {
        public string id { get; set; }
        public List<Datum> data { get; set; }
    }
    

    i used this wizard as well json2csharp.com to generate class for deserialized

    for using that

    using RestSharp;
    using Newtonsoft.Json;
    
    IRestResponse restSharp= callRestGetMethodby_restSharp(api_server_url);
    string jsonString= restSharp.Content;
    
    RootObject rootObj= JsonConvert.DeserializeObject<RootObject>(jsonString);
    return Json(rootObj);
    

    if you call rest by restsharp

        public IRestResponse callRestGetMethodby_restSharp(string API_URL)
        {
            var client = new RestSharp.RestClient(API_URL);
            var request = new RestRequest(Method.GET);
            request.AddHeader("Content-Type", "application/json");
            request.AddHeader("cache-control", "no-cache");
            IRestResponse response = client.Execute(request);
            return response;
        }
    

    also you can get this 6 line of restsharp from getpostman.com tools

    0 讨论(0)
  • 2020-12-03 14:26

    The simplest way is deserialize array of key-value pairs to IDictionary<string, string>:

    
    public class SomeData
    {
        public string Id { get; set; }
    
        public IEnumerable<IDictionary<string, string>> Data { get; set; }
    }
    
    private static void Main(string[] args)
    {
        var json = "{ \"id\": \"123\", \"data\": [ { \"key1\": \"val1\" }, { \"key2\" : \"val2\" } ] }";
    
        var obj = JsonConvert.DeserializeObject<SomeData>(json);
    }
    
    

    But if you need deserialize that to your own class, it can be looks like that:

    
    public class SomeData2
    {
        public string Id { get; set; }
    
        public List<SomeDataPair> Data { get; set; }
    }
    
    public class SomeDataPair
    {
        public string Key { get; set; }
    
        public string Value { get; set; }
    }
    
    private static void Main(string[] args)
    {
        var json = "{ \"id\": \"123\", \"data\": [ { \"key1\": \"val1\" }, { \"key2\" : \"val2\" } ] }";
    
        var rawObj = JObject.Parse(json);
    
        var obj2 = new SomeData2
        {
            Id = (string)rawObj["id"],
            Data = new List<SomeDataPair>()
        };
    
        foreach (var item in rawObj["data"])
        {
            foreach (var prop in item)
            {
                var property = prop as JProperty;
    
                if (property != null)
                {
                    obj2.Data.Add(new SomeDataPair() { Key = property.Name, Value = property.Value.ToString() });
                }
    
            }
        }
    }
    
    

    See that I khow that Value is string and i call ToString() method, there can be another complex class.

    0 讨论(0)
提交回复
热议问题