2013-02-09 3 views
0

Рассмотрим JSON:Как получить данные из JSON в WP7

resourceSets: [ 
{ 
estimatedTotal: 5, 
resources: [ 
{ 
__type: "Location:http://schemas.microsoft.com/search/local/ws/rest/v1", 
bbox: [ 
51.3014406, 
-8.3233626, 
51.3037489, 
-8.3182203 
], 
name: "Some Address", 
point: { 
type: "Point", 
coordinates: [ 
51.3033847, 
-2.3204335 
] 
}, 
address: { 
addressLine: "SomeAddress", 
adminDistrict: "MI", 
adminDistrict2: "South Country", 
countryRegion: "England", 
formattedAddress: "Some Formattedaddress", 
locality: "Derby", 
postalCode: "12345" 
}, 

и т.д ..

Тесно после этого: http://blog.clauskonrad.net/2010/11/wp7-how-to-consume-json-data-from.html

Мой класс:

[DataContract] 
public class ReturnedDetails 
{ 
    [DataMember(Name="formattedAddress")] 
    public string formattedAddress { get; set; } 

} 

И код события:

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     using (var ms = new system.IO.MemoryStream(Encoding.Unicode.GetBytes(e.Result))) 
     { 
      var ser = new DataContractJsonSerializer(typeof(ReturnedDetails[])); 
      ReturnedDetails[] obj = (ReturnedDetails[])ser.ReadObject(ms); 
     } 
    } 

Когда я запускаю это, InvalidCastException выбрасывается в ReturnedDetails[] obj = (ReturnedDetails[])ser.ReadObject(ms);

Когда я отладки и парить над ser, KnownDataContracts «не могли бы оценить выражение» и «нулевой».

Я просто хочу получить значение из форматированногоAddress в JSON, кто-нибудь знает как?

Спасибо за любую помощь.

Стек трассировки:

на PhoneApp1.MainPage.wc_DownloadStringCompleted (отправитель объекта, DownloadStringCompletedEventArgs е) при System.Net.WebClient.OnDownloadStringCompleted (DownloadStringCompletedEventArgs е) при System.Net.WebClient. DownloadStringOperationCompleted (Объект Arg) в System.Reflection.RuntimeMethodInfo.InternalInvoke (RuntimeMethodInfo RtMI, OBJ Object, BindingFlags invokeAttr, Связующее связующего, объект параметры, CultureInfo культуры, логическое isBinderDefault, Асем Блай вызывающего абонента, булева VerifyAccess, StackCrawlMark & stackMark) при System.Reflection.RuntimeMethodInfo.InternalInvoke (объект Объект, BindingFlags invokeAttr, Связующее Связующее, Object [], параметры CultureInfo культуры, StackCrawlMark & stackMark) при System.Reflection. MethodBase.Invoke (объект OBJ, Object []) параметры
в System.Delegate.DynamicInvokeOne (Object [] арг) при System.MulticastDelegate.DynamicInvokeImpl (Object [] арг) при System.Delegate.DynamicInvoke (Object [] args) в System.Windows.Threading.DispatcherOperation.Invoke() в System.Windows.Threading.Dispatcher.Dispatch (DispatcherPrio rity приоритет) в System.Windows.Threading.Dispatcher.OnInvoke (Объект контекста) при System.Windows.Hosting.CallbackCookie.Invoke (Object [] арг) при System.Windows.Hosting.DelegateWrapper.InternalInvoke (Object [ ] арг)
в System.Windows.RuntimeHost.ManagedHost.InvokeDelegate (IntPtr pHandle, Int32 nParamCount, ScriptParam [] pParams, ScriptParam & pResult)

ответ

2

Самый простой способ сделать это, чтобы иметь классы для весь JSON. Я использую JSON 2 C#, чтобы написать шаблон для этого. Это даст вам класс RootObject, который смотрит на JSON в целом.

WebResponse ws = req.GetResponse(); 
//Deserialize the JSON 
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(RootObject)); 
//Cast to root object 
RootObject ro = (RootObject)ds.ReadObject(ws.GetResponseStream()); 

Оттуда вы можете пройти через ваш RootObject проведет свой ReturnedDetails[].

Смежные вопросы