我正在准备一个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);
}
}
通常,当JSON中的键可以更改时,您可以使用Dictionary<string, T>
代替常规类来处理它。请看这个问题来举例说明我的意思。然而,这种方法在您的情况下不起作用,因为您的结果中还有一个布尔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();
}
}
要使用它,请在Result
类中添加一个[JsonConverter]
属性,如下所示:
[JsonConverter(typeof(ResultConverter))]
public class Result
{
...
}
Fiddle:https://dotnetfiddle.net/ACR5Un
使用JsonConvert.DeserializeObject将无法执行此操作;您可能需要创建一个JsonReader来实现此逻辑。