我一直在尝试让传入的 Json 消息进行序列化(并正确反序列化)时遇到了可怕的时间。 首先是我通过POSTMAN发布到我们的MVC休息服务的传入Json。 通过JsonLint验证了它。 主要问题是两个子数组,帐户和属性值显示为空。 serviceAddresses是profilePush的数组成员,其其他属性正在填充。在将它们全部制作成数据合约之前,我得到了服务地址的空值。 我在这里错过了什么?
------------传入的 JSON ------------------
{
"userId" : 15,
"firstName" : "Michael",
"lastName" : "Smith",
"email" : "msmith@google.org",
"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":"msmith@google.org","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; }
}
问题是这个 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 propertyAttributes
是一个object
,而不是一个array
。由于 json 反序列化程序需要一个数组但获取一个对象,因此它无法填充您的属性,并且您会得到 null。
确定这是你得到的 JSON 吗?它甚至无效,因为属性名称在一个对象中多次使用。这是正确的:
"propertyAttributes": [
{
"attr_name": "heat_type",
"attr_value": "Gas"
}, {
"attr_name": "hot_water_heater_type",
"attr_value": "Gas"
}
]
在这里,您将获得一个[...]
对象的数组{..}
每个对象都有一个属性attr_name
和一个属性attr_value
。