我正在尝试将json对象反序列化为c#对象,但是无法做到。这是我发送的json对象
{
"User_":
{
"Email":"test@test.com",
"Password":"pass1"
}
}
这是我使用的c#类
public class User_
{
public string Email { get; set; }
public string Password { get; set; }
}
公共类User_ { 公用字符串电子邮件{get;组; } 公共字符串密码{get;组; } }
public class RootObject
{
public User_ User_ { get; set; }
}
这是我用来反序列化的代码
RootObject request = JsonConvert.DeserializeObject<RootObject>(json.ToString());
此代码创建一个User_对象,但“电子邮件”和“密码”字段为空。我在这里做什么错了?
在调试时,我看到了
{{ "{\"Email_\":\"test@test.com\",\"Password_\":\"pass1\"}": "" }}
看起来很奇怪
答案 0 :(得分:2)
直接反序列化类的对象时,JSON中不需要类名。另一方面,如果要反序列化上面给出的JSON,请使用RootObject反序列化
var user = JsonConvert.DeserializeObject<RootObject>(json.ToString()).User_;
与
public class RootObject
{
public User_ User_ { get; set; }
}
OR
反序列化以下JSON:
{
"Email":"test@test.com",
"Password":"pass1"
}
答案 1 :(得分:1)
如果这样做,我将得到Email
和Password
的正确值:
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();
}
}
您可以看到它在HERE上运行
答案 2 :(得分:0)
我相信您的c#类中有2个问题
在您的RootObject
类中,您必须使用
public User_ User{get;set;}
对Json进行序列化时必须使用。
User_ request = JsonConvert.DeserializeObject<RootObject>(json.ToString());
这将解决您的问题。
答案 3 :(得分:0)
您可以尝试使用此代码吗?
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());
答案 4 :(得分:0)
主要问题是您的RootObject被序列化为一个新对象的属性名称,其中字符串为空。对许多序列化服务器端的结果。
您可以轻松地进行处理,一旦密码/电子邮件更改,您将需要一个新的密码,以下类仅适用于确切的Json响应。
public partial class DontDoThis
{
[JsonProperty("{\"Email_\":\"test@test.com\",\"Password_\":\"pass1\"}")]
public string EmailTestTestComPasswordPass1 { get; set; }
}
为了解决这个问题,您留了下来:
-更改代码服务器端以提供正确的结果。
-字符串操作,用于删除和取消转义结果。
-一次反序列化,然后再次反序列化。
答案 5 :(得分:0)
当键名不是纯字母时,为什么不使用 [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);
输出: