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

时间:2014-07-02 16:35:38

标签: 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"
 } 
}

解析此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字符串,那将会非常棒。

3 个答案:

答案 0 :(得分:55)

您可以反序列化为字典。

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

答案 1 :(得分:44)

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

  

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

例如,如果你有

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

解决方案:使用注释:

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

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

答案 2 :(得分:0)

您可以使用以下扩展名:

    public String get_SHA_512_SecurePassword(String passwordToHash, String salt){
    String generatedPassword = null;
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-512");
        md.update(salt.getBytes(StandardCharsets.UTF_8));
        byte[] bytes = md.digest(passwordToHash.getBytes(StandardCharsets.UTF_8));
        StringBuilder sb = new StringBuilder();
        for(int i=0; i< bytes.length ;i++){
            sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
        }
        generatedPassword = sb.toString();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return generatedPassword;
    }