【问题标题】:JSON Deserialization is not setting C# ObjectJSON反序列化未设置C#对象
【发布时间】:2015-11-25 16:52:15
【问题描述】:

我是 JSON 新手。我正在尝试将 JSON 对象反序列化为 C# 对象。我没有收到错误。反序列化后,C# 对象属性全部为空。 我定义的 C# 对象具有所有可能的属性。但 JSON 对象并不具备所有这些属性。
这是我的 C# 对象:

[DataContract]
internal class Name
{
private string strFamilyName = string.Empty;
private string strGivenName = string.Empty;
private string strMiddleName = string.Empty;
private string strHonorificPrefix = string.Empty;
private string strHonorificSuffix = string.Empty;

[DataMember]
public string familyName
{
    get { return strFamilyName; }
    set { strFamilyName = value; }
}

[DataMember]
public string givenName
{
    get { return strGivenName; }
    set { strGivenName = value; }
}

[DataMember]
public string middleName
{
    get { return strMiddleName; }
    set { strMiddleName = value; }
}

[DataMember]
public string honorificPrefix
{
    get { return strHonorificPrefix; }
    set { strHonorificPrefix = value; }
}

[DataMember]
public string honorificSuffix
{
    get { return strHonorificSuffix; }
    set { strHonorificSuffix = value; }
}
}

[DataContract]
internal class UserProperties
{
private Name objName = null;
private string strEmail = string.Empty;
private string strMobile = string.Empty;
private string strPager = string.Empty;
private string strDegree = string.Empty;
private string strRole = string.Empty;
private string strSpecialty = string.Empty;
private string strDepartment = string.Empty;

[DataMember]
public Name name
{
    get { return objName; }
    set { objName = value; }
}

[DataMember]
public string email
{
    get { return strEmail; }
    set { strEmail = value; }
}

[DataMember]
public string mobile
{
    get { return strMobile; }
    set { strMobile = value; }
}

[DataMember]
public string pager
{
    get { return strPager; }
    set { strPager = value; }
}

[DataMember]
public string degree
{
    get { return strDegree; }
    set { strDegree = value; }
}

[DataMember]
public string role
{
    get { return strRole; }
    set { strRole = value; }
}

[DataMember]
public string specialty
{
    get { return strSpecialty; }
    set { strSpecialty = value; }
}

[DataMember]
public string department
{
    get { return strDepartment; }
    set { strDepartment = value; }
}
}

[DataContract]
internal class CortextUser
{
private string strCUID = string.Empty;
private string strInviteStatus = string.Empty;
private bool bIsEnabled = false;
private UserProperties objUserProperties = null;

[DataMember]
public string cuid
{
    get { return strCUID; }
    set { strCUID = value; }
}

[DataMember]
public string invitationStatus
{
    get { return strInviteStatus; }
    set { strInviteStatus = value; }
}

[DataMember]
public bool isEnabled
{
    get { return bIsEnabled; }
    set { bIsEnabled = value; }
}

[DataMember]
public UserProperties userProperties
{
    get { return objUserProperties; }
    set { objUserProperties = value; }
}       
}

这是我使用代码时返回的 JSON 对象:

HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse();
Stream resStream = resp.GetResponseStream();
StreamReader reader = new StreamReader(resStream);
System.Diagnostics.Debug.WriteLine("JSON form of User object: ");
System.Diagnostics.Debug.WriteLine(reader.ReadToEnd());

JSON form of User object: 
[
    {   
        "cuid":"1338857734894",
        "invitationStatus":"invite_accepted",
        "isEnabled":true,
        "userProperties":
        {
            "name":
            {
                "familyName":"Smith",
                "givenName":"John"
            },
            "email":"jsmith@test.org",
            "mobile":"(111) 333-4444",
            "role":"Developer",
            "specialty":"Development",
            "department":"IS"
        }
    }
]

当我运行这段代码时:

HttpWebResponse resp = (HttpWebResponse)httpWebRequest.GetResponse();
Stream resStream = resp.GetResponseStream();
UserResult = (CortextUser)jsonSerializer.ReadObject(resStream);

UserResult 对象的所有属性都设置为它们的初始化属性。

当 JSON 对象反序列化为 C# 对象时,是否所有属性都需要存在?

【问题讨论】:

  • 你的 Json 似乎是一个 UserResult 类型的数组。看看这个,stackoverflow.com/questions/16856846/… 将其序列化为一个列表,然后根据您的示例获取您的第一个结果。
  • 没有。它不是 UserResult 类型的数组。 UserResult 对象有嵌套对象,即 UserProperties 和 UserProperties 有一个 Name 对象。
  • 是的,我可以看到上面对象中定义的用户属性,但在顶层,您的整个响应都包含在 [ ] 中,这意味着数组的开始。你的恰好是一个 1 的数组。
  • 谢谢。你是对的。我将研究如何反序列化一个数组。
  • 一旦你序列化到一个列表,你可以简单地先调用它,你应该得到你需要的 UserResult 对象,但是我可能会检查列表计数以确保你没有得到返回超过 1 个对象。 :) 希望对你有用!

标签: c# json json-deserialization


【解决方案1】:

将您的 JSON 放入 https://app.quicktype.io/ 会产生这些类:

public class Name
{
    public string familyName { get; set; }
    public string givenName { get; set; }
}

public class UserProperties
{
    public Name name { get; set; }
    public string email { get; set; }
    public string mobile { get; set; }
    public string role { get; set; }
    public string specialty { get; set; }
    public string department { get; set; }
}

public class RootObject
{
    public string cuid { get; set; }
    public string invitationStatus { get; set; }
    public bool isEnabled { get; set; }
    public UserProperties userProperties { get; set; }
}

将 JSON 作为字符串后,您可以使用 JSON.NET 将其反序列化:

var root = JsonConvert.DeserializeObject<IEnumerable<RootObject>>(json);

您需要反序列化为 IEnumerable,因为您的 JSON 包含在方括号中(即 [ ... ]),这意味着它是一个列表/数组/集合。

这是一个显示它工作的小提琴https://dotnetfiddle.net/hTM7EQ

【讨论】:

    【解决方案2】:

    试过了

    CortextUser user = JsonConvert.DeserializeObject<CortextUser>(text);
    

    使用Newtwonsoft Json库并获取有效对象

    【讨论】:

    • IT 是一个数组,所以我必须添加第一个答案中列出的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2015-08-05
    相关资源
    最近更新 更多