【问题标题】:JSON.NET deserialize/serialize JsonProperty JsonObjectJSON.NET 反序列化/序列化 JsonProperty JsonObject
【发布时间】:2012-12-18 06:56:27
【问题描述】:

我有一个关于使用 Newtonsoft JSON.NET 库进行反序列化/序列化的问题:

我收到了这个 json:

 {
    "customerName" : "Lorem",
    "id": 492426
    "sequence": 1232132
    "type" : 3,
    "status" : 0,
    "streetNumber" : 9675,
    "streetName" : "Lorem",
    "suite" : null,
    "city" : "IPSUM",
    "provinceCode" : "QC",
    "postalCode" : "H1P1Z3",
    "routeNumber" : 0,
    "poBox" : 0,
    "streetType" : "CH",
    "userId" : 25,
    "streetDirection" : null,
    "countryCode" : "CA",
    "customerNickName" : "Lorem ipsum",
    "streetSuffix" : null,
    "contacts" : [ {
        "status" : 0,
        "telephone" : 4445555555,
        "extension" : 0,
        "email" : "webtest@test.com",
        "id" : 50,
        "fullName" : "name",
        "department" : "department"
    } ],
    "attribute" : {
      "nbrOfUse" : 1,
      "lastUse" : "2013-01-03T09:57:28-0500"
    }       
}

我的问题在于这部分:

    "attribute" : {
      "nbrOfUse" : 1,
      "lastUse" : "2013-01-03T09:57:28-0500"
    }

在我的address 课程中,是否可以执行以下操作:

    [JsonProperty(PropertyName = "lastUse", ObjectName="attribute")]
    or [JsonProperty(PropertyName = "lastUse")][JsonObject(PropertyName = "attribute")]
    or something like this ...
    public DateTime? LastUse { get; set; }

我不会使用JObject.Parse(...),因为 json 很大

我的班级:

public class Address
{
    /// <summary>
    /// Gets or sets the id of the <see cref="Address" /> class.
    /// </summary>
    /// <value>
    /// id from index as400 for validating address with canada post
    /// Type Int64, The id.
    /// </value>
    [JsonProperty(PropertyName = "id")]
    public int Id { get; set; }

    /// <summary>
    /// Gets or sets the number of the <see cref="Company" /> class.
    /// </summary>
    /// <value>
    /// Type String, The number.
    /// </value>
    [JsonProperty(PropertyName = "streetNumber")]
    [Display(Name = "CompanyNumber", ResourceType = typeof(AccountModels))]
    //[MustBeEmptyIfAnotherIsNotEmpty("PoBox", ErrorMessageResourceType = typeof(GenericValidator), ErrorMessageResourceName = "MustBeEmptyIfAnotherIsNotEmpty")]
    public string Number { get; set; }

    /// <summary>
    /// Gets or sets the type of the street.
    /// </summary>
    /// <value>
    /// The type of the street.
    /// </value>
    [JsonProperty(PropertyName = "streetType")]
    [Display(Name = "StreetType", ResourceType = typeof(AccountModels))]
    //[MustBeEmptyIfAnotherIsNotEmpty("PoBox",false, ErrorMessageResourceType = typeof(GenericValidator), ErrorMessageResourceName = "MustBeEmptyIfAnotherIsNotEmpty")]
    public string StreetType { get; set; }

    /// <summary>
    /// Gets or sets the street of the <see cref="Company" /> class.
    /// </summary>
    /// <value>
    /// Type String, The street.
    /// </value>
    [JsonProperty(PropertyName = "streetName")]
    [Display(Name = "CompanyStreet", ResourceType = typeof(AccountModels))]
    [StringLength(50, ErrorMessageResourceType = typeof(GenericValidator), ErrorMessageResourceName = "Length", MinimumLength = 2)]
    //[MustBeEmptyIfAnotherIsNotEmpty("PoBox", ErrorMessageResourceType = typeof(GenericValidator), ErrorMessageResourceName = "MustBeEmptyIfAnotherIsNotEmpty")]
    public string Street { get; set; }

    [Display(Name = "StreetDirection", ResourceType = typeof(AccountModels))]
    [StringLength(2, ErrorMessageResourceType = typeof(GenericValidator), ErrorMessageResourceName = "Length", MinimumLength = 0)]
    public string StreetDirection { get; set; }

    [Display(Name = "StreetSuffix", ResourceType = typeof(AccountModels))]
    [StringLength(1, ErrorMessageResourceType = typeof(GenericValidator), ErrorMessageResourceName = "Length", MinimumLength = 0)]
    public string StreetSuffix { get; set; }

    /// <summary>
    /// Gets or sets the street suite of the <see cref="Company" /> class.
    /// </summary>
    /// <value>
    /// Type String, The street suite.
    /// </value>
    [JsonProperty(PropertyName = "suite")]
    [Display(Name = "CompanyStreetSuite", ResourceType = typeof(AccountModels))]
    [StringLength(50, ErrorMessageResourceType = typeof(GenericValidator), ErrorMessageResourceName = "Length", MinimumLength = 0)]
    //[MustBeEmptyIfAnotherIsNotEmpty("PoBox",false, ErrorMessageResourceType = typeof(GenericValidator), ErrorMessageResourceName = "MustBeEmptyIfAnotherIsNotEmpty")]
    public string StreetSuite { get; set; }

    /// <summary>
    /// Gets or sets the city of the <see cref="Company" /> class.
    /// </summary>
    /// <value>
    /// Type String, The city.
    /// </value>
    [Required]
    [JsonProperty(PropertyName = "city")]
    [Display(Name = "CompanyCity", ResourceType = typeof(AccountModels))]
    public string City { get; set; }

    /// <summary>
    /// Gets or sets the province of the <see cref="Company" /> class.
    /// </summary>
    /// <value>
    /// Type String, The province.
    /// </value>
    [Required]
    [Display(Name = "CompanyProvince", ResourceType = typeof(AccountModels))]
    [JsonProperty(PropertyName = "provinceCode")]
    public string Province { get; set; }

    /// <summary>
    /// Gets or sets the postal code of the <see cref="Company" /> class.
    /// </summary>
    /// <value>
    /// Type String, The postal code.
    /// </value>
    [JsonProperty(PropertyName = "postalCode")]
    [Display(Name = "CompanyPostalCode", ResourceType = typeof(AccountModels))]
    [PostalCode("Country", ErrorMessageResourceType = typeof(GenericValidator), ErrorMessageResourceName = "PostalCode")]
    public string PostalCode { get; set; }

    /// <summary>
    /// Gets or sets the country of the <see cref="Company" /> class.
    /// </summary>
    /// <value>
    /// Type String, The country.
    /// </value>
    [JsonProperty(PropertyName = "country")]
    [Display(Name = "Country", ResourceType = typeof(AccountModels))]
    public string Country { get; set; }

    // ....//

    /*record info*/
    [Display(Name = "modifyDate", ResourceType = typeof(Resources.Models.Address))]
    public DateTime ModifyDate { get; set; }

    [Display(Name = "endDate", ResourceType = typeof(Resources.Models.Address))]
    public DateTime? EndDate { get; set; } // when she deactivated

    [Display(Name = "lastUse", ResourceType = typeof(Resources.Models.Address))]
    public DateTime? LastUse { get; set; }

    [Display(Name = "nbrOfUse", ResourceType = typeof(Resources.Models.Address))]
    public int NbrOfUse { get; set; }
}

【问题讨论】:

    标签: c# asp.net-mvc json.net


    【解决方案1】:

    您需要为“属性”创建自定义类型,例如:

        public class Attribute {
    
            [JsonProperty(PropertyName = "nbrOfUse")]
            public int _nbrOfUse { get; set; }
            [JsonProperty(PropertyName = "streetType")]
            [Display(Name = "lastUse", ResourceType = typeof(AccountModels))]
            public string _lastUse { get; set; }
    
        }
    

    并在您的 Address 类中创建一个 Object of Attribute 类。

    【讨论】:

    • 我不想在我的地址类中使用对象属性...我不能因为这个类已经用于其他人的视图...而且它很丑...不?
    【解决方案2】:

    您可以使用的一种可能的解决方案是在解析 JSON 字符串之前对其进行操作,例如使用正则表达式。

    你会识别和替换

    "attribute" : {
       "nbrOfUse" : 1,
       "lastUse" : "2013-01-03T09:57:28-0500"
     }
    

    "lastUse" : "2013-01-03T09:57:28-0500"
    

    那么,您的序列化程序会识别日期时间吗?名为“lastUsed”的属性

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多