1

您好,我正在创建 WebAPI 和一个与此 API 通信的 windows8 Metro 应用程序。

我将使用简单的示例

API

public IEnumerable<string> Get() {
        return new string[] { "value1", "value2" };
}

应用

using (HttpClient client = new HttpClient())
        {
            using (var response = await client.GetAsync(this.apiUri.GetUri("content", "Get")))
            {
                var result = await response.Content.ReadAsStringAsync();

            }
        }

现在变量结果是来自 API 的响应。但这是形式上的字符串

"[\"value1\",\"value2\"]"

我该如何解析/转换它?

4

3 回答 3

2

WebAPI 默认返回 JSON。您可以请求它发送 XML,或使用 JSON 解析器。

于 2012-08-08T16:03:58.663 回答
1

在您的情况下,您可以轻松地使用Json.Net反序列化:

var json = "[\"value1\",\"value2\"]";
var values = JsonConvert.DeserializeObject<string[]>(json);
于 2012-08-08T17:41:23.700 回答
0

我在 silverlight 中使用我的类 (MVCClient.cs) 与 MVC WebAPI 进行通信。在你的情况下,你只想打电话:

DoGetMessage<string>(yourUrl, new DataDelegateArray<string>(yourCallbackFunction));

您在代码中缺少的行将是:

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
T data = (T)serializer.ReadObject(stream);

其中 T 是字符串 []。

MVCClient.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Runtime.Serialization.Json;
using System.Text;
public class MVCClient
    {
        public delegate void DataDelegateArray<T>(T[] objects);
        public delegate void DataDelegate<U>(U obj);

    #region Communication Functions
        public void DoPostMessage<T>(string queryURL, T item, ProcessPOSTResult<T> callback)
        {
            DoPostMessage<T, T>(queryURL, item, callback);
        }

        public void DoPostMessage<TPost, TReply>(string queryURL, TPost item, ProcessPOSTResult<TReply> callback)
        {
#if SILVERLIGHT
            Uri uri = new Uri(queryURL, UriKind.Absolute);

            var request = (HttpWebRequest)WebRequest.Create(uri);
            request.Method = "POST";
            request.ContentType = "application/json";
            request.BeginGetRequestStream(result =>
                {
                    var req = (HttpWebRequest)result.AsyncState;
                    var stream = req.EndGetRequestStream(result);

                    if (stream != null)
                    {
                        var data = new
                        {
                            name = item
                        };


                        System.IO.MemoryStream ms = new System.IO.MemoryStream();
                        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(TPost));
                        serializer.WriteObject(stream, item);
                        stream.Close();
                    }

                    req.BeginGetResponse((requestResult) =>
                    {
                        var req2 = (HttpWebRequest)requestResult.AsyncState;
                        var response = req2.EndGetResponse(requestResult);
                        var responseStream = response.GetResponseStream();
                        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(TReply));
                        TReply responseItem = (TReply)serializer.ReadObject(responseStream);

                        System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
                        {
                            callback(responseItem);
                        });

                    }, req);
                }, request);

#endif
        }

        public void DoGetMessage<T>(string queryURL, DataDelegateArray<T> callback)
        {
            DoGetMessage<T[]>(queryURL, result => callback(result));
        }

        public void DoGetMessage<T>(string queryURL, DataDelegate<T> callback)
        {
#if SILVERLIGHT
            Uri uri = new Uri(queryURL, UriKind.Absolute);

            var request = (HttpWebRequest)WebRequest.Create(uri);
            request.Method = "GET";
            request.Accept = "text/json";
            request.BeginGetResponse((result) =>
            {
                var response = request.EndGetResponse(result);
                var stream = response.GetResponseStream();

                if (stream != null)
                {
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
                    T data = (T)serializer.ReadObject(stream);
                    System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        callback(data);
                    });
                }
                else
                    System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        callback(default(T));
                    });
            }, null);
#endif
        }
        #endregion
    }
于 2012-08-08T16:19:39.710 回答