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

Posted

技术标签:

【中文标题】如何解析会导致非法 C# 标识符的 JSON 字符串?【英文标题】:How can I parse a JSON string that would cause illegal C# identifiers? 【发布时间】:2014-08-23 13:32:06 【问题描述】:

我一直在使用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"
  

解析这个 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; 

但它不能是真正的 C# 类,因为我们知道类名不能以数字开头。

如果有人能建议如何解析这种类型的 json 字符串,那就太好了。

【问题讨论】:

你的逻辑错了。据我所知,您有一个具有相同结构的项目列表。因此,您的类应该代表该结构,而不是列表,并且您应该将 JSON 解析为 .NET 列表,而不是多个类。 只要看起来像键值对,下面的答案就在 @Bartdude 列表还是不是列表? 是的,还有另一个类具有两个属性,一个用于 1 类,另一个用于 2 类 L.B.这里unders比我解释得更清楚:-) 【参考方案1】:

您可以反序列化为字典。

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; 


var dict = JsonConvert.DeserializeObject<Dictionary<string, Item>>(json);

【讨论】:

非常感谢......工作就像一个魅力......问题解决了。但我仍然不知道它是如何工作的。你能解释一下字典是如何工作的吗? @TaLhaKhan 因为您的 json 代表键值对。 “1”是键,... 是值。【参考方案2】:

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

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

例如,如果你有


    "0": "04:15",
    "zzz": "foo"

解决方案:使用注解:

public class Item

   [JsonProperty("0")]
   public string AnyName  get; set; 

   [JsonProperty("zzz")]
   public string AnotherName  get; set; 

【讨论】:

当然,如果 Keys 的数量及其名称是事先知道的。不适合动态创建的对象,如userid : name:aa,surname:bb, anotheruserid: @I4V 如果它们是动态创建的对象,您可能无论如何都无法使用预定义的类。 @R0MANARMY 我不是这个意思。键可以是动态的,例如来自 db 的 guid 或 id。但它的值是已知类型。 1232574:name:john, 755344674:name:doe【参考方案3】:

你可以使用这个扩展:

public static class JsonExtensions

    public static Dictionary<string, T> ToObject<T>(this string json)
    
        return JsonConvert.DeserializeObject<Dictionary<string, T>>(json);
    

    public static string ToJson<T>(this T obj)
    
        return JsonConvert.SerializeObject(obj);
    

【讨论】:

以上是关于如何解析会导致非法 C# 标识符的 JSON 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

C#调用接口返回json数据中含有双引号 或其他非法字符的解决办法

如何使用 JSON Utility 读取键中带有连字符的对象?

在 C# 中解析 Json 字符串

C#如何生成JSON字符串提交给接口(服务器)

C# 使用 Newtonsoft 解析 JSON

解析从 c# 返回的 json 字符串数组