读取具有更改的属性名称的JSON

时间:2015-12-04 12:04:37

标签: 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);
    }
}

2 个答案:

答案 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
{
    ...
}

小提琴:https://dotnetfiddle.net/ACR5Un

相关问题