【问题标题】:Deserialize JSON string into a C# complex class object将 JSON 字符串反序列化为 C# 复杂类对象
【发布时间】:2015-01-25 11:00:14
【问题描述】:

如果类包含简单的 JSON 兼容类型,MyClass obj = JsonConvert.DeserializeObject<MyClass>(JSONtext); 做得很好。如果MyClass 包含enumstruct 属性,则DeserializeObject<> 方法返回null。我目前正在遍历反序列化为 JObject 的 JSON 响应,将值分配给创建的内部类,然后返回它。有没有更好的方法将 JSON 字符串反序列化为异构类对象?

class MyClass
{
    public Int32 wishlistID;
    public Basket currentBasket; //struct
    public List<Int32> items;
    public dStatus _dStatus; //enum
}

编辑:事实证明,出于某种原因Basket 的所有属性都有 private 修饰符;当然它们无法访问,因此结果为null。将其切换到 public 就可以了。

【问题讨论】:

    标签: c# json json.net deserialization


    【解决方案1】:

    您的成员必须是 public 才能使用。

    不起作用

    public class MyClass
    {
        Int32 a;
        string b; //struct
    }
    
    string json = "{ a: 7, b:'abc' }";
    MyClass cc = JsonConvert.DeserializeObject<MyClass>(json);
    

    确实工作:

    public class MyClass
    {
        public Int32 a;
        public string b; //struct
    }
    
    string json = "{ a: 7, b:'abc' }";
    MyClass cc = JsonConvert.DeserializeObject<MyClass>(json);
    

    编辑:

    所以在我们通过了那些公开的东西之后,你声称结构\枚举通过。
    下面是他们的示例:

    public class MyClass
    {
        public Int32 a;
        public test b;
        public eMyEnum c;
    }
    
    public struct test
    {
        public string str;
    }
    
    public enum eMyEnum
    {
        A = 0,
        B
    }
    
    string json = "{ a: 7, b: {str:'str'}, c: 'B' }";
    MyClass cc = JsonConvert.DeserializeObject<MyClass>(json);
    

    【讨论】:

    • 已编辑,忘记添加public修饰符,谢谢!
    • 至于b属性,如果它是Basket结构,该方法仍然会返回null。
    • @ShinyPhoenix - 我已经编辑并添加了一个 structs\enums 工作的示例。请提供更多信息,以便我们发现您的错误。
    • 啊,他们确实做到了!出于某种原因 - 无法意识到我在编写代码时的想法 - struct 的所有属性都是私有的!将它们切换到public 就可以了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 2018-03-20
    • 2017-11-25
    相关资源
    最近更新 更多