反序列化JSON 2维值数组

时间:2010-10-27 01:03:18

标签: json json.net datacontractjsonserializer

我有一个JSON格式的二维数组:

[[57, 2], [57, 2], [58, 2], [55, 2], [60, 2], [54, 1], [59, 11]]

每对中实际上包含一对不相关的读数,每分钟有一对。所以在第一分钟,读数1是57,读数2是2。在第二分钟,读数是相同的等等。

现在,我想将其转换为我可以在.Net中使用的格式来绘制每个读数。这可以是两个并行数组,一个用于读取第一个值,每个分钟有一个元素,一个数组用于第二个值的所有读数。或者它可以是一个二维数组,如果这更容易。

我尝试使用DataContractJSONSerializer没有任何运气:

IEnumerable<SubmissionDataRow> obj = (IEnumerable<SubmissionDataRow>)ser.ReadObject(reader, false);

其中SubmissionDataRow只是一个具有每个读数属性的类,但反序列化器不知道要在哪个属性中放入什么值!

2 个答案:

答案 0 :(得分:0)

回到我的.NET时代,我正在使用Jayrock,它的工作就像一个魅力。

答案 1 :(得分:0)

您可以使用Json.Net以两种方式执行此操作。如果您不介意使用二维数组,则可以简单地反序列化为int[][]

string json = "[[57, 2], [57, 2], [58, 2], [55, 2], [60, 2], [54, 1], [59, 11]]";

int[][] values = JsonConvert.DeserializeObject<int[][]>(json);

如果您希望使用问题中提到的强类型类,则可以使用JsonConverter填充它。

像这样定义你的类:

[JsonConverter(typeof(SubmissionDataRowConverter))]
class SubmissionDataRow
{
    public int Reading1 { get; set; }
    public int Reading2 { get; set; }
}

这样的转换器:

class SubmissionDataRowConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(SubmissionDataRow));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JArray array = JArray.Load(reader);
        return new SubmissionDataRow
        {
            Reading1 = array[0].Value<int>(),
            Reading2 = array[1].Value<int>()
        };
    }

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

然后你可以像这样反序列化:

List<SubmissionDataRow> rows = 
            JsonConvert.DeserializeObject<List<SubmissionDataRow>>(json);