正在读取属性名称发生更改的JSON

  • 本文关键字:JSON 读取 属性 c# json.net
  • 更新时间 :
  • 英文 :


我正在准备一个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来实现此逻辑。

相关内容

  • 没有找到相关文章

最新更新