为什么我的JSon在子数组上给我空值?

时间:2013-10-24 15:50:08

标签: c# arrays json serialization datacontracts

我一直在尝试将传入的Json消息序列化(并正确反序列化)。首先是我通过POSTMAN发布到我们的MVC休息服务的传入Json。通过JsonLint验证它。主要问题是两个子数组,accounts和propertyValues都是null。 serviceAddresses是profilePush的数组成员,其他属性正在填充。在我将它们全部转换为DataContracts之前,我获得了serviceAddresses的null值。我在这里缺少什么?

------------传入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; }
    }

1 个答案:

答案 0 :(得分: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反序列化器需要一个数组但是得到一个对象,它不能填充你的属性并且你得到null。

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

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

在这里,您会得到一个[...]个对象{..},每个对象都有一个属性attr_name和一个属性attr_value