2013-10-24 25 views
0

我一直有一个可怕的时间试图让一个传入的Json消息序列化(和反序列化正确)。首先是我通过POSTMAN发布到MVC休息服务的传入Json。通过JsonLint进行验证。主要问题是两个子数组,account和propertyValues都是空的。 serviceAddresses是profilePush的一个数组成员,它的其他属性正在填充。在我将它们全部纳入DataContracts之前,我获得了serviceAddresses的空值。我在这里错过了什么?为什么我的JSon在子数组上给我空值?

------------传入JSON ------------------

{ 
    "userId" : 15, 
    "firstName" : "Michael", 
    "lastName" : "Smith", 
    "email" : "[email protected]", 
    "deleted" : false, 
    "serviceAddresses" : [ { 
    "addressId" : 18, 
    "address1" : "8401 Lorain Road", 
    "address2" : "Suite 10A", 
    "city" : "Newton Falls", 
    "state" : "OH", 
    "zip" : "44021", 
    "deleted" : false, 
    "accounts" : [], 
    "propertyAttributes" : { 
     "attr_name" : "heat_type", 
     "attr_value" : "Gas", 
     "attr_name" : "hot_water_heater_type", 
     "attr_value" : "Gas", 
     "attr_name" : "rent_own", 
     "attr_value" : "Own", 
     "attr_name" : "sq_ft", 
     "attr_value" : "2000", 
     "attr_name" : "stove_type", 
     "attr_value" : "Gas" 
          } 
         } 
    ] 
    } 





    [HttpPost] 
    public JsonResult profileInformationPush(profilePush profile) 
    { 
      bool bError = false; 

      string s = JsonConvert.SerializeObject(profile); 

      profilePush deserializedProfile = 
      JsonConvert.DeserializeObject<profilePush>(s); 

    } 

------- - 这是什么“个人资料”的模样进来的程序--------------

{"UserId":15,"FirstName":"Michael","LastName":"Smith","Email":"[email protected]","Deleted":"False","ServiceAdresses":[{"AddressId":18,"Address1":"8401 Lorain Road","Address2":"Suite 10A","City":"Newton Falls","State":"OH","Zip":"44021","Deleted":"False","Accounts":null,"PropertyAttributes":null}]} 


--------------Data Contracts --------------------- 



    [DataContract] 
     public class accountInfo 
     { 
      [DataMember(Name="accountNumber", EmitDefaultValue = false)] 
      public string AccountNumber { get; set; } 
      [DataMember(Name="deleted", EmitDefaultValue = false)] 
      public string Deleted { get; set; } 
     } 



    [DataContract] 
    public class PropertyAttributes 
    { 
     [DataMember(Name="attr_name", EmitDefaultValue = false)] 
     public string Attr_Name { get; set; } 
     [DataMember(Name="attr_value", EmitDefaultValue = false)] 
     public string Attr_Value { get; set; } 

    } 

    [DataContract] 
    public class ServiceAddresses 
    { 
     [DataMember(Name="addressId", EmitDefaultValue = false)] 
     public int AddressId { get; set; } 
     [DataMember(Name="address1", EmitDefaultValue = false)] 
     public string Address1 { get; set; } 
     [DataMember(Name="address2", EmitDefaultValue= false)] 
     public string Address2 { get; set; } 
     [DataMember(Name="city", EmitDefaultValue = false)] 
     public string City { get; set; } 
     [DataMember(Name="state", EmitDefaultValue = false)] 
     public string State { get; set; } 
     [DataMember(Name="zip", EmitDefaultValue = false)] 
     public string Zip { get; set; } 
     [DataMember(Name="deleted", EmitDefaultValue = false)] 
     public string Deleted { get; set; } 
     [DataMember(Name="accounts", EmitDefaultValue = false)] 
     public accountInfo[] Accounts { get; set; } 

     [DataMember(Name = "propertyAttributes", EmitDefaultValue = false)] 
     public PropertyAttributes[] PropertyAttributes { get; set; } 
    } 

    [DataContract] 
    public class profilePush 
    { 
     [DataMember(Name="userId", EmitDefaultValue= false)] 
     public int UserId { get; set; } 
     [DataMember(Name="firstName", EmitDefaultValue = false)] 
     public string FirstName { get; set; } 
     [DataMember(Name="lastName", EmitDefaultValue = false)] 
     public string LastName { get; set; } 
     [DataMember(Name="email", EmitDefaultValue = false)] 
     public string Email { get; set; } 
     [DataMember(Name="deleted", EmitDefaultValue = false)] 
     public string Deleted { get; set; } 
     [DataMember(Name="serviceAddresses", EmitDefaultValue = false)] 
     public ServiceAddresses[] ServiceAddresses { get; set; } 
    } 
+0

这是什么消耗?它是一种Web服务还是其他类型的服务? – Justin

+0

[JSONLint](http://jsonlint.com/)验证它,但是默默拒绝所有重复的attr_name和attr_value字段,并且只保留最后一个。这不是真正有效的JSON。这就像'x = 1; x = 2; x = 3;'然后想要所有3个值。 –

回答

0

问题是这样的JSON:

"propertyAttributes" : { 
    "attr_name" : "heat_type", 
    "attr_value" : "Gas", 
    "attr_name" : "hot_water_heater_type", 
    "attr_value" : "Gas", 
    "attr_name" : "rent_own", 
    "attr_value" : "Own", 
    "attr_name" : "sq_ft", 
    "attr_value" : "2000", 
    "attr_name" : "stove_type", 
    "attr_value" : "Gas" 
} 

和你结构:

[DataMember(Name = "propertyAttributes", EmitDefaultValue = false)] 
    public PropertyAttributes[] PropertyAttributes { get; set; } 

他们不适合。根据你的JSON propertyAttributesobject,而不是array。而且由于json反序列化器需要一个数组但是得到一个对象,它不能填充你的属性,而你得到空值。

你确定这是你得到的JSON吗?它甚至不是有效的,因为属性名称在一个对象内多次使用。这将是正确的:

"propertyAttributes": [ 
    { 
     "attr_name": "heat_type", 
     "attr_value": "Gas" 
    }, { 
     "attr_name": "hot_water_heater_type", 
     "attr_value": "Gas" 
    } 
] 

在这里,你得到的每个对象{..}数组[...]与属性attr_name和财产attr_value

+0

这是由客户端发送的Json,它实际上通过了JsonLint的有效。没有注意到缺少括号来将propertyAttributes表示为数组。将联系客户修复他们的发送应用程序。谢谢! –

相关问题