c# - 使用 Json.NET 反序列化字符串和对象的混合集合

标签 c# json .net serialization json.net

我正在开发一个用于解析 Minecraft JSON 文件的库。然而,它们的格式有点奇怪,我不知道如何用 Newtonsoft 的 JSON.net 进行解析:

{
    "values": [
        "some_object",
        "another_object",
        {
            "name": "third_object",
            "required": false
        }
    ]
}

我尝试将 values 数组反序列化的类如下所示:

class TagValue
{
    public string Name;
    public bool Required = false;
}

因此,对于只是字符串的值,应该将 Name 设置为字符串,并将 Required 设置为 false。

有什么办法可以做到这一点吗?我对这个库非常陌生,不知道如何做比最基本的反序列化更高级的事情。

最佳答案

试试这个

[JsonConverter(typeof(TagValueConverter))]
class TagValue
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("required")]
    public bool Required { get; set; }

    private class TagValueConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(string) ||
                objectType == typeof(TagValue);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.String)
                return new TagValue
                {
                    Name = reader.Value as string
                };
            else
            {
                var jobj = JObject.Load(reader);
                var obj = new TagValue();
                serializer.Populate(jobj.CreateReader(), obj);
                return obj;
            }
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
}

那么大概您有/需要一个外部对象的类:

class TagValues
{
    [JsonProperty("values")]
    public TagValue[] Values { get; set; }

    public static void TestMe()
    {
        string json = @"{
            ""values"": [
                ""some_object"",
                ""another_object"",
                {
                    ""name"": ""third_object"",
                    ""required"": true
                }
            ]
        }";

        var tags = JsonConvert.DeserializeObject<TagValues>(json);

        Debug.Assert(tags.Values?.Length == 3);
        Debug.Assert(tags.Values[0].Name == "some_object");
        Debug.Assert(tags.Values[1].Name == "another_object");
        Debug.Assert(tags.Values[2].Name == "third_object" &&
                    tags.Values[2].Required == true);
    }
}

PS - 您还应该按照评论中的建议设置这些字段的属性。

关于c# - 使用 Json.NET 反序列化字符串和对象的混合集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75841617/

相关文章:

javascript - 在高 map 中的纬度/经度 map 点上单击事件

c# - SQL Server 事务提交超时

c# - 实现通用方法

c# - 构造函数链接传递参数的计算值

java - url 中的非法参数异常

c# - 隐藏 GridView ID 列

javascript - 无法使用 Lodash 实现 JSON 结构

c# - 如何在 .net 中将 SID 转换为字符串

c# - 如何以编程方式获取 user.config 文件的位置?

c# - 如何在 C# 中使用 lambda 表达式检测元素是否存在?