正如@Jamiec 提到的,需要考虑内联 JSON 字符串;所以,你将不得不反序列化两次。
对于这个答案,我们将完全避免使用dynamic(不创建自定义JsonConverter)并避免使用JObject(即IDictionary<string, JToken>);
我们将为类别定义一个类型。 (对于第二种,迭代反序列化)
public class Categories
{
public double Category1 { get; set; }
public double Category2 { get; set; }
public double Category3 { get; set; }
}
我们将用IEnumerable<IDictionary<string, string>> 替换dynamic[]。每个字典实际上只有一个条目,因此我们将在迭代处理中使用string.Join() 简单地连接Keys 和Values。
var jsonText = "[{\"series1\":\"{\\\"Category1\\\":4.3,\\\"Category2\\\":2.5,\\\"Category3\\\":3.5}\"},{\"series2\":\"{\\\"Category1\\\":2.4,\\\"Category2\\\":4.4,\\\"Category3\\\":1.8}\"},{\"series3\":\"{\\\"Category1\\\":2,\\\"Category2\\\":2,\\\"Category3\\\":3}\"}]";
var jsonResult = JsonConvert.DeserializeObject<IEnumerable<IDictionary<string, string>>>(jsonText);
var r = jsonResult.Select(i =>
{
(string Series, Categories Categories) result = (string.Join(string.Empty, i.Keys), JsonConvert.DeserializeObject<Categories>(string.Join(string.Empty, i.Values)));
return result;
}).ToArray();
(最后一部分使用解构到ValueTuple)
dynamic 这里实际上是一个JObject,它实现了IDictionary<string, JToken>。 JToken 相当灵活(实际上它可以与上面的 sn-p 一起使用 - 包括 string.Join 的用法),但根据范围和偏好,我们反序列化为原始 string。