0

入ってくる Json メッセージをシリアライズ (およびデシリアライズ) するのに苦労しました。1 つ目は、POSTMAN 経由で MVC レスト サービスに投稿する受信 Json です。JsonLint で検証しました。主な問題は、accounts と propertyValues の 2 つのサブ配列が 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; }
    }
4

1 に答える 1

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 でよろしいですか? プロパティ名は 1 つのオブジェクト内で複数回使用されるため、有効ではありません。これは正しいでしょう:

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

ここでは、それぞれがプロパティとプロパティを持つ[...]オブジェクトの配列を取得します。{..}attr_nameattr_value

于 2013-10-24T15:57:33.400 に答える