2013-10-24 7 views
0

나는 들어오는 Json 메시지를 직렬화 (그리고 올바르게 역 직렬화)하려고 할 때 끔찍한 시간을 보내고있다. 먼저 들어오는 Json을 POSTMAN을 통해 MVC rest service에 게시합니다. JsonLint를 통해 유효성을 검사했습니다. 주된 문제는 두 개의 하위 배열 인 accounts와 propertyValues가 null로 오는 것입니다. serviceAddresses는 profilePush의 배열 멤버이고 다른 속성은 채워집니다. DataContracts에 모두 넣기 전에 serviceAddresses에 null 값이 발생했습니다. 내가 여기서 무엇을 놓치고 있니?내 JSon에서 하위 배열에 null을 지정하는 이유는 무엇입니까?

------------ 수신 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

무엇을 소비합니까? 그것은 웹 서비스 또는 다른 종류의 서비스입니까? – 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 propertyAttributes에 따르면 objectarray이 아닙니다. 그리고 json 디시리얼라이저는 배열을 기대하지만 객체를 가져 오기 때문에 속성을 채울 수없고 null이됩니다.

당신이 얻은 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를 배열로 나타내려면 대괄호가 부족하다는 것을 알지 못했습니다. 전송 앱을 수정하기 위해 클라이언트에 문의하십시오. 감사! –