我正在尝试准备一个内容与此类似的JSON文件:
{
"result": {
"1357": {
"icon": "smiley-face",
"name": "happy"
},
"success": true
}
}
下面这个例子有效,但我遇到的问题是classid
的属性名称总是不同的。如何在不知道属性名称的情况下反序列化classid
?
using System;
using System.IO;
using Newtonsoft.Json;
public class ClassId
{
[JsonProperty("icon")]
public string Icon { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
}
public class Result
{
[JsonProperty("1357")] // this key is always different
public ClassId classid { get; set; }
[JsonProperty("success")]
public bool Success { get; set; }
}
public class Example
{
[JsonProperty("result")]
public Result Result { get; set; }
}
class Program
{
static void Main(string[] args)
{
var json = File.ReadAllText("test.json");
var container = JsonConvert.DeserializeObject<Example>(json);
Console.WriteLine(container.Result.classid.Icon);
}
}
答案 0 :(得分:0)
您无法使用JsonConvert.DeserializeObject执行此操作;您可能需要创建JsonReader来实现此逻辑。
答案 1 :(得分:0)
通常,当JSON中的键可以更改时,您可以使用Dictionary<string, T>
代替常规类来处理它。有关我的意思,请参阅this question。但是,这种方法在您的情况下不起作用,因为您的结果中还有一个布尔success
标志,并且不会与Dictionary<string, ClassId>
混合。因此,您需要使用JsonConverter
反序列化Result
类。以下是您需要的代码:
class ResultConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Result);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject obj = JObject.Load(reader);
Result result = new Result();
result.Success = (bool)obj["success"];
JProperty prop = obj.Properties().FirstOrDefault(p => p.Name != "success");
if (prop != null)
{
result.classid = prop.Value.ToObject<ClassId>(serializer);
}
return result;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
要使用它,请在[JsonConverter]
类中添加Result
属性,如下所示:
[JsonConverter(typeof(ResultConverter))]
public class Result
{
...
}