无法反序列化JSON数组

本文关键字:数组 JSON 反序列化 | 更新日期: 2023-09-27 18:16:20

我有如下Json:

[
    {
        "name": "ts.DatumVon",
        "value": "29.10.2015"
    },
    {
        "name": "ts.Von",
        "value": "8:00"
    },
    {
        "name": "ts.Bis",
        "value": "16:30"
    }
]

对于这个类:

public class TSInfo
{
    public TimeSaver ts { get; set; }
    [Display(Name = "Status")]
    public TSStatus tsStatus { get; set; }
    [Display(Name = "Typ")]
    public TSTyp tsTyp { get; set; }
    public TSAuswahlSteps step { get; set; }
}

如何在控制器方法中反序列化这个Json字符串?

编辑:我希望这能澄清问题。

public class TimeSaver
{
    public DateTime DatumVon { get; set; }
    public TimeSpan Von { get; set; }
    public TimeSpan Bis { get; set; }
}

我试过这样做:

string tsi = [{"name":"ts.DatumVon","value":"29.10.2015"},{"name":"ts.Von","value":"8:00"},{"name":"ts.Bis","value":"16:30"}]
var dict = JsonConvert.DeserializeObject<List<Dictionary<String,String>>(tsi);

无法反序列化JSON数组

您提供的JSON是一个字典列表。你可以反序列化它(使用newtonsoft。json)像这样:

string json = "your json";
var result = JsonConvert.Deserialize<List<Dictionary<String,String>>(json);

如何将结果映射到你的类取决于你。

EDIT上面的内容没有意义。对不起。

嗯,你的JSON让我有些头疼,但我想我已经修好了。

JSON是KeyValuePairs的数组。每一对都描述了您的TimeSaver类的一个属性。数组作为一个整体描述了完整的类。我不知道有什么简单的方法可以将JSON转换为c#类。使问题更加复杂的是,每个属性都有某种名称空间前缀:ts。最后一个复杂的问题是日期格式。这不是自动识别的格式。

我的解决方案将JSON转换为描述TimeSaver对象的新JSON。然后使用JsonConvert对这个新的JSON进行反序列化。

还有一个问题:TimeSaver.DateVon变成了一个字符串。

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
public class Program
{
    public static void Main()
    {
        string tsi = "[{'"name'":'"ts.DatumVon'",'"value'":'"29.10.2015'"},{'"name'":'"ts.Von'",'"value'":'"8:00'"},{'"name'":'"ts.Bis'",'"value'":'"16:30'"}]";
        var attributes = JsonConvert.DeserializeObject<List<NameValuePair>>(tsi);
        attributes = attributes
            .Select(item => new NameValuePair { Name = item.Name.Replace("ts.", ""), Value = item.Value })
            .ToList();
        var newJson = "{" + String.Join(",", attributes.Select(item => String.Format("'"{0}'":'"{1}'"", item.Name, item.Value))) + "}";
        Console.WriteLine(newJson);
        var ts = JsonConvert.DeserializeObject<TimeSaver>(newJson);
        Console.WriteLine(ts.DatumVon);
        Console.WriteLine(ts.Von);
        Console.WriteLine(ts.Bis);
    }
}
public class NameValuePair
{
    public string Name { get; set; }
    public string Value { get; set; }
}
public class TimeSaver
{
    public String DatumVon { get; set; }
    public TimeSpan Von { get; set; }
    public TimeSpan Bis { get; set; }
}