Json.NET:序列化/反序列化数组

7

我正在使用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"]

我收到了一个错误信息。

我做错了什么?我如何正确地读取一个数组?我如何正确地读取以下类型的二维数组 [[1, 2, 3], [4, 5, 6]]

2个回答

2

根据你所做的事情而定。在你的情况下,最简单的方法是创建一个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]
            }");

2

Favorite_numbers属性将是JArray类型,因为它无法推断出应该是什么类型。最方便的反序列化对象的方法是定义一个C#类,并使用JsonConvert.DeserializeObject<T>(...)方法将JSON反序列化为您定义的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接