如何解析会导致非法C#标识符的JSON字符串?

TaL*_*han 40 c# json json.net

我一直在使用NewtonSoft JSON Convert库来解析JSON字符串并将其转换为C#对象.但是现在我遇到了一个非常笨拙的JSON字符串,我无法将其转换为C#对象,因为我无法从这个JSON字符串中创建一个C#类.

这是JSON字符串

{
"1": {
    "fajr": "04:15",
    "sunrise": "05:42",
    "zuhr": "12:30",
    "asr": "15:53",
    "maghrib": "19:18",
    "isha": "20:40"
},
"2": {
    "fajr": "04:15",
    "sunrise": "05:42",
    "zuhr": "12:30",
    "asr": "15:53",
    "maghrib": "19:18",
    "isha": "20:41"
 } 
}
Run Code Online (Sandbox Code Playgroud)

解析此JSON字符串所需的C#类应如下所示:

public class 1 {

    public string fajr { get; set; }
    public string sunrise { get; set; }
    public string zuhr { get; set; }
    public string asr { get; set; }
    public string maghrib { get; set; }
    public string isha { get; set; }
}

public class 2 {

    public string fajr { get; set; }
    public string sunrise { get; set; }
    public string zuhr { get; set; }
    public string asr { get; set; }
    public string maghrib { get; set; }
    public string isha { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但它不能成为一个真正的C#类,因为我们知道类名不能以数字开头.

如果有人可以建议如何解析这种类型的json字符串,那将是非常好的.

L.B*_*L.B 57

您可以反序列化为字典.

public class Item
{
    public string fajr { get; set; }
    public string sunrise { get; set; }
    public string zuhr { get; set; }
    public string asr { get; set; }
    public string maghrib { get; set; }
    public string isha { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
var dict = JsonConvert.DeserializeObject<Dictionary<string, Item>>(json);
Run Code Online (Sandbox Code Playgroud)

  • @TaLhaKhan因为你的json代表键值对."1"是关键,`{...}`是值. (4认同)

ken*_*n2k 45

虽然字典是您具体案例的最佳解决方案,但您提出的问题也可以解释为:

如何使用无法在C#中使用的属性名反序列化对象?

例如,如果有的话

{
    "0": "04:15",
    "zzz": "foo"
}
Run Code Online (Sandbox Code Playgroud)

解决方案:使用注释:

public class Item
{
   [JsonProperty("0")]
   public string AnyName { get; set; }

   [JsonProperty("zzz")]
   public string AnotherName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 当然,如果事先知道*Keys*的数量及其名称.不适合动态创建的对象,如`userid:{name:aa,surname:bb},anotheruserid:{}` (5认同)