使用Json.NET反序列化键值对的数组

鉴于以下json:

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

这是一个更大的树的一部分,我如何将“数据”属性反序列化为:

 List Data { get; set; } 

要么

 List Data { get; set; } 

要么

 Dictionary Data { get; set; } 

使用Json.NET? 两个版本都可以(我更喜欢List of MyCustomClass)。 我已经有一个包含其他属性的类,如下所示:

 public class SomeData { [JsonProperty("_id")] public string Id { get; set; } ... public List Data { get; set; } } 

其中“MyCustomClass”只包含两个属性(Key和Value)。 我注意到有一个KeyValuePairConverter类,它听起来像我需要的那样,但我无法找到如何使用它的例子。 谢谢。

最简单的方法是将键值对的数组反序列化为IDictionary

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

但是如果你需要将它反序列化到你自己的类中,它可能看起来像这样:

public class SomeData2 { public string Id { get; set; } public List 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() }; 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() }); } } } }
public class SomeData2 { public string Id { get; set; } public List 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() }; 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() }); } } } } 

看到我知道Valuestring而我调用ToString()方法,可以有另一个复杂的类。

我最终这样做了:

 [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; } } 
 public class Datum { public string key1 { get; set; } public string key2 { get; set; } } public class RootObject { public string id { get; set; } public List data { get; set; } } 

我使用这个向导以及json2csharp.com来生成反序列化的类

使用它

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

如果你通过restsharp打电话给rest

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

你也可以从getpostman.com工具中获得这6行restsharp