如何解析会导致非法C#标识符的JSON字符串?
我一直在使用库解析JSON字符串并将其转换为C#对象。但现在我遇到了一个非常笨拙的JSON字符串,我无法将其转换为C对象,因为我无法用这个JSON字符串生成C类 下面是JSON字符串如何解析会导致非法C#标识符的JSON字符串?,c#,json,json.net,C#,Json,Json.net,我一直在使用库解析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
{
"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字符串,那就太好了。您可以反序列化到字典
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(json);
虽然字典是针对您的具体案例的最佳解决方案,但您提出的问题也可以解释为:
如何反序列化具有无法使用的属性名称的对象
在C#中
例如,如果你有
{
"0": "04:15",
"zzz": "foo"
}
解决方案:使用注释:
public class Item
{
[JsonProperty("0")]
public string AnyName { get; set; }
[JsonProperty("zzz")]
public string AnotherName { get; set; }
}
您可以使用以下扩展:
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);
}
}
公共静态类JsonExtensions
{
公共静态字典ToObject(此字符串为json)
{
返回JsonConvert.DeserializeObject(json);
}
公共静态字符串ToJson(此T obj)
{
返回JsonConvert.SerializeObject(obj);
}
}
您的逻辑错误。据我所见,您有一个具有相同结构的项目列表。因此,您的类应该表示该结构,而不是列表,您应该将JSON解析为一个.NET列表,而不是几个类on@Bartdude列出还是不列出?是的,还有一个类有两个属性,一个用于类1,另一个用于类2L.B。下面的人比我更清楚地解释了这一点:-)非常感谢..工作得很有魅力..问题解决了。但我仍然不知道它是如何工作的。你能解释一下字典是如何工作的吗?@TaLhaKhan因为你的json代表键值对。“1”是键,{…}
是值。当然,如果事先知道键的数量及其名称。不适用于动态创建的对象,如userid:{name:aa,姓氏:bb},另一个userid:{}
@I4V如果它们是动态创建的对象,您可能无法使用预定义的类。@R0MANARMY我不是这个意思。键可以是动态的,例如从db提交的guid或id。但它的值是已知的类型<代码>{{1232574:{name:john},755344674:{name:doe}}
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);
}
}