我正在开发一个用于解析 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/