2012-03-05 3 views
1

Привет Я использую DataContractJsonSerializer сериализации JSON, который выглядит следующим образомJson в Windows Phone 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; 

я получаю ArgumentException при попытке ReadObject. Если классы, которые я создаю, не совпадают, результат должен быть прав только нуль? Почему я получаю исключение ArgumentException? Неужели мой json трудно разобрать? Спасибо за помощь.

Редактировать: внизу находится трассировка стека.

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

Согласно Microsoft, documentation, ArgumentException может occurr в FieldInfo.SetValue, если

  • поле не существует на объекте, или
  • значение параметр не может быть преобразован и хранится в поле.

Первый маловероятен. Так что вторая, скорее всего, причина.

Это означает, что у вас есть класс со свойством/полем, которое несовместимо с тем, что вы получаете в данных JSON, например. поле является целым числом, но вы получите строку.

Трассировка стека далее указывает, что проблемное поле вложено на три уровня глубиной, где третий уровень представляет собой коллекцию. Если я правильно интерпретирую это, это может быть, например, быть полем id категорий.

+0

спасибо. Пятно на. Но как вы узнали, на каком уровне проблема. Извините, я больше из java и совершенно новый здесь –

+1

В трассировке стека некоторые методы (например, 'ConvertDictionaryToClassDataContract') появляются несколько раз ближе к вершине стека. Это указывает на то, что используется рекурсивный синтаксический анализатор, где каждая открывающая скобка или скобка на входе приводит к вызову рекурсивного метода в синтаксическом анализаторе. Из этого вы можете получить глубину гнездования. Но, не зная исходного кода, это не точно. Я могу легко отключиться на один уровень. – Codo