簡體   English   中英

將 JSON 反序列化為 C# 對象

[英]Deserialize JSON into C# Object

我正在嘗試將 json 對象反序列化為 c# 對象,但無法做到。 這是我發送的 json 對象

{
    "User_":
    {
        "Email":"test@test.com",
        "Password":"pass1"
    }
}

這是我使用的 c# 類

public class User_
{
    public string Email { get; set; }
    public string Password { get; set; }
}

public class User_ { public string Email { get; 放; }公共字符串密碼{獲取; 放; } }

public class RootObject
{
    public User_ User_ { get; set; }
}

這是我用來反序列化的代碼

RootObject request = JsonConvert.DeserializeObject<RootObject>(json.ToString());

此代碼創建一個 User_ 對象,但電子郵件和密碼字段為空。 我在這里做錯了什么?

當我在調試時,我看到了即將發生的事情

{{ "{\"Email_\":\"test@test.com\",\"Password_\":\"pass1\"}": ""  }}

看起來很奇怪

直接反序列化一個類的對象時,JSON 中不需要類名。 另一方面,如果您反序列化上面給出的 JSON,則使用 RootObject 反序列化

var user = JsonConvert.DeserializeObject<RootObject>(json.ToString()).User_;

public class RootObject
{
    public User_ User_ { get; set; }
}

或者

反序列化以下 JSON:

    {
        "Email":"test@test.com",
        "Password":"pass1"
    }

如果我這樣做,我會得到正確的EmailPassword值:

public class User_
  {
    public string Email { get; set; }
    public string Password { get; set; }
  }

  public class RootObject
  {
    public User_ User_ { get; set; }
  }

  class Program
  {
    static void Main(string[] args)
    {
      string jsonString = "{\"User_\":{\"Email\":\"test@test.com\",\"Password\":\"pass1\"}}";
      RootObject request = JsonConvert.DeserializeObject<RootObject>(jsonString.ToString());
      Console.WriteLine("Email: {0}", request.User_.Email);
      Console.WriteLine("Password: {0}", request.User_.Password);
      Console.ReadLine();
    }
  }

你可以看到它在這里工作

當您的鍵名不是純字母時,為什么不使用[JsonProperty("KeyName")]

[JsonProperty("KeyName")]為您提供反序列化包含一些鍵的此類 json 的優勢,例如

  • 用戶_
  • 用戶$
  • @用戶
  • *用戶&

還有很多

只需將此屬性添加到您的類屬性中,例如

[JsonProperty("User_")]
public User User { get; set; }

這使您的屬性名稱保持簡單且更具可讀性

所以最后你的json

{
    "User_":
    {
        "Email_":"test@test.com",
        "Password_":"pass1"
    }
}

添加JsonProperty后的所有類看起來像

public class RootObject
{
    [JsonProperty("User_")]
    public User User { get; set; }
}

public class User
{
    [JsonProperty("Email_")]
    public string Email { get; set; }

    [JsonProperty("Password_")]
    public string Password { get; set; }
}

用法:

RootObject request = JsonConvert.DeserializeObject<RootObject>(json.ToString());

Console.WriteLine(request.User.Email);
Console.WriteLine(request.User.Password);

輸出:

在此處輸入圖片說明

我相信你的 c# 課有兩個問題

  1. 在您的RootObject類中,您必須使用

    public User_ User{get;set;}
  2. 當您序列化 Json 時,您必須使用。

     User_ request = JsonConvert.DeserializeObject<RootObject>(json.ToString());

這將解決您的問題。

你可以試試這個代碼。

public class User_
{
    public string Email { get; set; }
    public string Password { get; set; }
}

public class RootObject
{
    public User_ User { get; set; }
}

反序列化操作:

RootObject request = JsonConvert.DeserializeObject<RootObject>(json.ToString());

主要問題是您的 RootObject 被序列化為一個新對象的屬性名稱,字符串為空作為值。 多次序列化服務器端的結果。

而且您可以輕松處理這些問題,一旦密碼/電子郵件更改,您將需要一個新的,以下類將僅適用於這個確切的 Json 響應。

public partial class DontDoThis
{
    [JsonProperty("{\"Email_\":\"test@test.com\",\"Password_\":\"pass1\"}")]
    public string EmailTestTestComPasswordPass1 { get; set; }
}

為了解決這個問題,你只剩下:
- 更改代碼服務器端以提供正確的結果。
- 字符串操作以刪除和取消轉義結果。
- 反序列化一次並再次反序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM