【问题标题】:Deserialize JSON with its children反序列化 JSON 及其子级
【发布时间】:2019-07-24 07:30:38
【问题描述】:

我正在尝试反序列化 json,但无法得到我想要的。我想将 json 反序列化为 C# 对象,但我无法反序列化它的子对象。我想分享我的代码并征求您的意见...

{
        "accessToken":"123",
        "requestId":"5mRIo6Y6epripoBA3YTM+ZDVgDVR2adB43euMJETguSboG0HT6j7Uje5mU0je5CF",
        "CreatedDate":"2019-07-24",
        "CartDetail":{
            "ProductId":"1",
            "Qty":"2",
            "Price":"3",
            "CreatedDate":"2019-07-24"
        }
}

这是尝试反序列化的 C# 代码

HttpContent requestContent = Request.Content;
string jsonContent = requestContent.ReadAsStringAsync().Result;
Cart cart = JsonConvert.DeserializeObject<Cart>(jsonContent);

此代码可以反序列化内部对象 CartDetail。我怎样才能解决这个问题?

这是购物车类

public partial class Cart
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Cart()
    {
        this.CartDetails = new HashSet<CartDetail>();
    }

    public int Id { get; set; }
    public string RequestId { get; set; }
    public string AccessToken { get; set; }
    public Nullable<int> UserId { get; set; }
    public System.DateTime CreatedDate { get; set; }

    public virtual User User { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<CartDetail> CartDetails { get; set; }
}

这是 CartDetail 类

public partial class CartDetail
{
    public int Id { get; set; }
    public int CartId { get; set; }
    public int ProductId { get; set; }
    public decimal Qty { get; set; }
    public decimal Price { get; set; }
    public System.DateTime CreatedDate { get; set; }

    public virtual Cart Cart { get; set; }
}

谢谢

【问题讨论】:

  • 可以添加类 Cart 和 CartDetail 的定义吗?
  • 嗨@RomEh,我添加了购物车和购物车详细信息。谢谢
  • 您没有在 json 中声明 CarDetail 数组。顺便说一句,这可能会有所帮助json2csharp.com
  • 在 json 中,CartDetails 不是一个数组,它是一个对象,但是在你的 c# 代码中你说它是一个 ICollection
  • 此外,它命名为 CartDetails,在您的 json 中命名为 CartDetail。

标签: c# json asp.net-web-api deserialization


【解决方案1】:

您的 JSON 与您的 c# 类不匹配。

CartDetail 不是 JSON 中的数组,但您已在 C# 代码中将其声明为 ICollection。

改为将您的 CartDetail 从 ICollection 更改为 CartDetail。此外,c# 属性名称需要与 JSON 属性名称匹配(如果您不想使用 JsonProperty 属性),因此将 CartDetails 重命名为 CartDetail。

顺便说一句,您似乎正试图直接反序列化为某些“域/业务类”?尝试创建单独的 dto 并对其进行反序列化,然后从 dto 中创建您的业务对象,这样会变得更干净:)

因此,请创建仅用于序列化/反序列化的新类,然后创建工厂或从新 dto 映射到业务对象的任何东西。关注点分离 FTW :)。

【讨论】:

    【解决方案2】:

    只需复制 JSON 并使用 Visual Studio 的特殊粘贴功能:

    它将为您生成以下类:

    public class Cart
    {
        public string accessToken { get; set; }
        public string requestId { get; set; }
        public string CreatedDate { get; set; }
        public Cartdetail CartDetail { get; set; }
    }
    
    public class Cartdetail
    {
        public string ProductId { get; set; }
        public string Qty { get; set; }
        public string Price { get; set; }
        public string CreatedDate { get; set; }
    }
    

    然后简单地反序列化它:

    【讨论】:

    • 我无法更改类,我正在使用实体框架。类是自动创建的。
    • 但是类应该将数据类型和名称与 JSON 匹配,以便正确反序列化它。如果类和 JSON 之间不匹配,那么您必须覆盖 JSON.NET 方法并手动映射字段。但我不确定这是否是一个好的解决方案。
    • @ArifYILMAZ 例如,JSON 中的 ProductId 是一个字符串,但在 CartDetail 类中,它被声明为 int。这些类型的不匹配永远不会允许正确的反序列化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多