2012-03-05 4 views
1

안녕에 나는 다음과 JSON를 직렬화하기 위해 DataContractJsonSerializer를 사용하고는 JSON은 윈도우 폰 7

{ 
"meta" : { 
    "code" : 200 
}, 
"response" : { 
    "venues" : [{ 
      "id" : "4eeb4c51775b1d4812e0261c", 
      "name" : "Shake Shack", 
      "contact" : { 
       "phone" : "7183077590", 
       "formattedPhone" : "(718) 307-7590" 
      }, 
      "location" : { 
       "address" : "409 Fulton St.", 
       "crossStreet" : "at Boerum Pl.", 
       "lat" : 40.692143731043416, 
       "lng" : -73.98904329061085, 
       "distance" : 1272, 
       "postalCode" : "11201", 
       "city" : "Brooklyn", 
       "state" : "NY", 
       "country" : "United States" 
      }, 
      "categories" : [{ 
        "id" : "4bf58dd8d48988d16c941735", 
        "name" : "Burger Joint", 
        "pluralName" : "Burger Joints", 
        "shortName" : "Burgers", 
        "icon" : { 
         "prefix" : "https:\/\/foursquare.com\/img\/categories\/food\/burger_", 
         "sizes" : [32, 44, 64, 88, 256], 
         "name" : ".png" 
        }, 
        "primary" : true 
       } 
      ], 
      "verified" : false, 
      "stats" : { 
       "checkinsCount" : 2812, 
       "usersCount" : 1945, 
       "tipCount" : 38 
      }, 
      "url" : "http:\/\/shakeshack.com", 
      "specials" : { 
       "count" : 0, 
       "items" : [] 
      }, 
      "hereNow" : { 
       "count" : 0 
      } 
     }, { 
      "id" : "49e644c6f964a5202f641fe3", 
      "name" : "Starbucks", 
      "contact" : { 
       "phone" : "2122192961", 
       "formattedPhone" : "(212) 219-2961", 
       "twitter" : "Starbucks" 
      }, 
      "location" : { 
       "address" : "72 Spring St.", 
       "crossStreet" : "at Crosby St.", 
       "lat" : 40.722642, 
       "lng" : -73.997989, 
       "distance" : 2526, 
       "postalCode" : "10012", 
       "city" : "New York", 
       "state" : "NY", 
       "country" : "United States" 
      }, 
      "categories" : [{ 
        "id" : "4bf58dd8d48988d1e0931735", 
        "name" : "Coffee Shop", 
        "pluralName" : "Coffee Shops", 
        "shortName" : "Coffee Shop", 
        "icon" : { 
         "prefix" : "https:\/\/foursquare.com\/img\/categories\/food\/coffeeshop_", 
         "sizes" : [32, 44, 64, 88, 256], 
         "name" : ".png" 
        }, 
        "primary" : true 
       } 
      ], 
      "verified" : true, 
      "stats" : { 
       "checkinsCount" : 15042, 
       "usersCount" : 6472, 
       "tipCount" : 73 
      }, 
      "specials" : { 
       "count" : 0, 
       "items" : [] 
      }, 
      "hereNow" : { 
       "count" : 0 
      } 
      } 
     ] 
    } 
} 

Stream stream = new MemoryStream(Encoding.Unicode.GetBytes(e.Result)); 
DataContractJsonSerializer obj = new DataContractJsonSerializer(typeof(Foursq)); 
Foursq result = obj.ReadObject(stream) as Foursq; 

내가 readObject를하려고 할 때 내가 ArgumentException이 얻을를 다음과 같이 내 코드입니다. 내가 만든 클래스가 일치하지 않으면 결과가 null이어야합니다. 맞습니까? 왜 ArgumentException이 발생합니까? 내 아들을 분석하기가 어렵습니까? 도와 줘서 고맙다.

편집 : 아래는 스택 추적입니다.

System.ArgumentException was unhandled 
Message=ArgumentException 
StackTrace: 
    at System.Reflection.FieldInfo.SetValue(Object obj, Object value) 
    at System.Runtime.Serialization.Json.ObjectToDataContractConverter.SetMemberValue(Object newInstance, Object value, MemberInfo memInfo) 
    at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ReadClassDataContractMembers(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, Object newInstance, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ConvertDictionaryToClassDataContract(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.DataContractJsonSerializer.ConvertObjectToDataContract(DataContract contract, Object value, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ConvertICollectionToCollectionDataContract(DataContractJsonSerializer serializer, CollectionDataContract contract, Object deserializedValue, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.DataContractJsonSerializer.ConvertObjectToDataContract(DataContract contract, Object value, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ReadClassDataContractMembers(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, Object newInstance, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ConvertDictionaryToClassDataContract(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.DataContractJsonSerializer.ConvertObjectToDataContract(DataContract contract, Object value, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ReadClassDataContractMembers(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, Object newInstance, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.ObjectToDataContractConverter.ConvertDictionaryToClassDataContract(DataContractJsonSerializer serializer, ClassDataContract dataContract, Dictionary`2 deserialzedValue, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.DataContractJsonSerializer.ConvertObjectToDataContract(DataContract contract, Object value, XmlObjectSerializerReadContextComplexJson context) 
    at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(Stream stream) 
    at PanoramaApp1.MainPage.wc_DownloadStringCompleted(Object sender, DownloadStringCompletedEventArgs e) 
    at System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs e) 
    at System.Net.WebClient.DownloadStringOperationCompleted(Object arg) 
    at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark) 
    at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark) 
    at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 
    at System.Delegate.DynamicInvokeOne(Object[] args) 
    at System.MulticastDelegate.DynamicInvokeImpl(Object[] args) 
    at System.Delegate.DynamicInvoke(Object[] args) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority) 
    at System.Windows.Threading.Dispatcher.OnInvoke(Object context) 
    at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args) 
    at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args) 
    at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32  nParamCount, ScriptParam[] pParams, ScriptParam& pResult) 
+0

질문에 ArgumentException 메시지를 추가 할 수 있습니까? –

+0

스택 추적을 추가했습니다. –

+0

'Encoding.UTF8.GetBytes'을 대신 사용해 보셨습니까? – f0x

답변

2

마이크로 소프트의 documentation에 따르면,

  • 이 필드는 객체에 존재하지 않는 경우 ArgumentExceptionFieldInfo.SetValue에 occurr하거나
  • 매개 변수는 변환에 저장할 수 없습니다 필드.

첫 번째 가능성은 낮습니다. 그래서 두 번째 것이 원인 일 가능성이 큽니다.

JSON 데이터에서받는 것과 호환되지 않는 유형의 속성/입력란을 가진 수업이 있음을 의미합니다 (예 : 필드는 정수이지만 문자열을받습니다.

스택 추적은 문제가있는 필드가 3 단계 깊이 중첩되어 있음을 나타냅니다. 여기서 세 번째 수준은 컬렉션입니다. 올바르게 해석하면 예 : 카테고리의 id 필드 여야합니다.

+0

고맙습니다. 에 딱 맞다. 그러나 문제가 어느 수준인지 알아 냈습니다. 죄송합니다. Java에서 더 많이 익숙해졌습니다. –

+1

스택 추적에서 일부 메서드 (예 :'ConvertDictionaryToClassDataContract')가 스택 맨 위에 여러 번 나타납니다. 이것은 입력에있는 각 여는 중괄호 또는 대괄호가 파서에서 재귀 적 메서드 호출을 유도하는 곳에서 재귀 적 구문 분석기가 사용됨을 나타냅니다. 그로부터 중첩 깊이를 도출 할 수 있습니다. 그러나 소스 코드를 모르면 정확하지 않습니다. 나는 한 수준 씩 쉽게 벗어날 수 있습니다. – Codo