简体   繁体   English

如何从wp7中的JSON获取数据

[英]How to get data from JSON in wp7

Consider this JSON: 考虑一下这个JSON:

    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"
},

etc.. 等等..

Closely following this: http://blog.clauskonrad.net/2010/11/wp7-how-to-consume-json-data-from.html 紧随其后: http//blog.clauskonrad.net/2010/11/wp7-how-to-consume-json-data-from.html

My class is: 我的班级是:

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

}

And the event code: 和事件代码:

    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);
        }
    }

When I run this, an InvalidCastException is thrown at ReturnedDetails[] obj = (ReturnedDetails[])ser.ReadObject(ms); 当我运行它时,在ReturnedDetails[] obj = (ReturnedDetails[])ser.ReadObject(ms);抛出InvalidCastException ReturnedDetails[] obj = (ReturnedDetails[])ser.ReadObject(ms);

When I debug and hover over ser , KnownDataContracts is 'Could not evaluate expression' and 'null'. 当我调试并将鼠标悬停在serKnownDataContracts是'无法计算表达式'和'null'。

I just want to get the value from the formattedAddress in the JSON, anyone know how? 我只是想从JSON中的formattedAddress获取值,有谁知道怎么做?

Thanks for any help. 谢谢你的帮助。

The stack trace is: 堆栈跟踪是:

at PhoneApp1.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) 在ServiceApp1.MainPage.wc_DownloadStringCompleted(Object sender,DownloadStringCompletedEventArgs e)的System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs e)处于System.Reflection.RuntimeMethodInfo.InternalInvoke的System.Net.WebClient.DownloadStringOperationCompleted(Object arg)处(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 System.Reflection.MethodBase.Invoke(Object obj,Object []参数)中的culture,StackCrawlMark和stackMark)
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) System.Delegate.DynamicInvokeIne(Object [] args)的System.Delegate.DynamicInvokeImpl(Object [] args)at System.Delegate.DynamicInvoke(Object [] args)at System.Windows.Threading.DispatcherOperation.Invoke()at System System.Windows.Hosting.DelegateWrapper上System.Windows.Hosting.CallbackCookie.Invoke(Object [] args)的System.Windows.Threading.Dispatcher.OnInvoke(Object context)中的.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority) .InternalInvoke(Object [] args)
at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult) 在System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle,Int32 nParamCount,ScriptParam [] pParams,ScriptParam&pResult)

The easiest way to do it is to have classes for the entire JSON. 最简单的方法是为整个JSON提供类。 I use JSON 2 C# to write the boilerplate for this. 我使用JSON 2 C#为此编写样板文件。 It will give you some RootObject class that looks at the JSON as a whole. 它将为您提供一些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());

From there you can go through your RootObject will hold your ReturnedDetails[] . 从那里你可以通过你的RootObject将持有你的ReturnedDetails[]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM