我正在使用Json.NET库。通过C#在JSON中序列化/反序列化数组最方便的方法是什么?例如,我正在尝试反序列化以下文本(从文件中读取):
{
"Name": "Christina",
"Gender": "female",
"Favorite_numbers": [11, 25 ,23]
}
我正在将上面的文字从文件读到变量:
JObject o = JObject.Parse(File.ReadAllText("input.txt"))
然后,当我尝试使用
提取数组[11, 24, 23]
时
int[] num = (int[]) o["Favorite_numbers"]
我收到错误。
我做错了什么?我如何正确读取数组?如何正确读取以下类型的2-dim数组[[1, 2, 3], [4, 5, 6]]
?
答案 0 :(得分:2)
Favorite_numbers
属性将是JArray
类型,因为它无法推断它应该是什么类型。反序列化该对象的最方便的方法是为它定义一个C#类,并使用JsonConvert.DeserializeObject<T>(...)
方法将JSON反序列化为您定义的类。
答案 1 :(得分:1)
取决于你在做什么。在您的情况下,最简单的方法是创建JsonConverter。所以你可以做到以下几点:
public class IntArrayConverter : JsonCreationConverter<int[]>
{
protected override int[] Create(Type objectType, JArray jArray)
{
List<int> tags = new List<int>();
foreach (var id in jArray)
{
tags.Add(id.Value<int>());
}
return tags.ToArray();
}
}
public abstract class JsonCreationConverter<T> : JsonConverter
{
/// <summary>
/// Create an instance of objectType, based properties in the JSON Array
/// </summary>
/// <param name="objectType">type of object expected</param>
/// <param name="jObject">contents of JSON Array that will be deserialized</param>
/// <returns></returns>
protected abstract T Create(Type objectType, JArray jObject);
public override bool CanConvert(Type objectType)
{
return typeof(T).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JArray jArray = JArray.Load(reader);
T target = Create(objectType, jArray);
return target;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
然后使用新属性定义模型:
public class Person
{
public string Name { get; set; }
public string Gender { get; set; }
[JsonConverter(typeof(IntArrayConverter))]
public int[] Favorite_numbers { get; set; }
}
你可以像往常一样使用它:
Person result = JsonConvert.DeserializeObject<Person>(@"{
""Name"": ""Christina"",
""Gender"": ""female"",
""Favorite_numbers"": [11, 25 ,23]
}");