Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解析会导致非法C#标识符的JSON字符串?_C#_Json_Json.net - Fatal编程技术网

如何解析会导致非法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

我一直在使用库解析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字符串,那就太好了。

您可以反序列化到字典

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);

您可以反序列化到字典

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; }
}

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

如何反序列化具有无法使用的属性名称的对象 在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);
}
}

您可以使用以下扩展:

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。下面的人比我解释得更清楚:-)你的逻辑是错误的。据我所见,您有一个具有相同结构的项目列表。因此,您的类应该表示该结构,而不是列表,您应该将JSON解析为一个.NET列表,而不是几个类on@Bartdude列出还是不列出?是的,还有一个类有两个属性,一个用于类1,另一个用于类2L.B。下面的人比我更清楚地解释了这一点:-)非常感谢..工作得很有魅力..问题解决了。但我仍然不知道它是如何工作的。你能解释一下字典是如何工作的吗?@TaLhaKhan因为你的json代表键值对。“1”是关键,
{…}
是价值。非常感谢..工作得很好..问题解决了。但我仍然不知道它是如何工作的。你能解释一下字典是如何工作的吗?@TaLhaKhan因为你的json代表键值对。“1”是键,
{…}
是值。当然,如果事先知道键的数量及其名称。不适用于动态创建的对象,如
userid:{name:aa,姓氏:bb},另一个userid:{}
@I4V如果它们是动态创建的对象,您可能无法使用预定义的类。@R0MANARMY我不是这个意思。键可以是动态的,例如从db提交的guid或id。但它的值是已知的类型<代码>{{1232574:{name:john},755344674:{name:doe}}当然,如果事先知道键的数量及其名称。不适合动态创建的对象,如
userid:{name:aa,姓氏:bb},另一个userid:{}
@I4V如果它们是动态创建的对象,你可能无论如何都不能使用预定义的类。@R0MANARMY我不是这个意思。键可以是动态的,例如guid或从db提交的id。但是它的值是已知的类型。
{{1232574:{name:john},755344674:{name:doe}