如何解析会导致非法 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数据中含有双引号 或其他非法字符的解决办法