从我发送的帖子请求中读取我的json响应

Jim*_*988 2 c# json windows-phone-8

我创建了一个post请求类,我可以重用它来向外部api发出POST请求并返回它们发送给我的对象(JSON):

class PostRequest
    {
        private Action<DataUpdateState> Callback;

        public PostRequest(string urlPath, string data, Action<DataUpdateState> callback)
        {
            Callback = callback;

            // form the URI
            UriBuilder fullUri = new UriBuilder(urlPath);
            fullUri.Query = data;

            // initialize a new WebRequest
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(fullUri.Uri);
            request.Method = "POST";

            // set up the state object for the async request
            DataUpdateState dataState = new DataUpdateState();
            dataState.AsyncRequest = request;

            // start the asynchronous request
            request.BeginGetResponse(new AsyncCallback(HandleResponse),
                dataState);
        }

        private void HandleResponse(IAsyncResult asyncResult)
        {
            // get the state information
            DataUpdateState dataState = (DataUpdateState)asyncResult.AsyncState;
            HttpWebRequest dataRequest = (HttpWebRequest)dataState.AsyncRequest;

            // end the async request
            dataState.AsyncResponse = (HttpWebResponse)dataRequest.EndGetResponse(asyncResult);
            if (dataState.AsyncResponse.StatusCode.ToString() == "OK")
            {
                Callback(dataState); // THIS IS THE LINE YOU SHOULD LOOK AT :)
            }
        }
    }

    public class DataUpdateState
    {
        public HttpWebRequest AsyncRequest { get; set; }
        public HttpWebResponse AsyncResponse { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Callback方法获取datastate对象并将其推送到此函数:

    public void LoadDashboard( DataUpdateState dataResponse )
    {
        Stream response = dataResponse.AsyncResponse.GetResponseStream();
        //Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
        //StreamReader readStream = new StreamReader(response, encode);
        //readStream.Close();


        Deployment.Current.Dispatcher.BeginInvoke(() => {
            App.RootFrame.Navigate(new Uri("/Interface.xaml", UriKind.RelativeOrAbsolute));
        });
    }
Run Code Online (Sandbox Code Playgroud)

我现在不确定如何获得从API发送给我的回复正文.它返回一个json格式,我需要能够将它映射到一个不错的C#类并用它来显示手机上的东西.

我找不到一个不使用JSON.NET的例子(它没有用于windows phone 8的程序集)


这是我安装HTTPClient类的错误:

Attempting to resolve dependency 'Microsoft.Bcl (? 1.1.3)'.
Attempting to resolve dependency 'Microsoft.Bcl.Build (? 1.0.4)'.
Successfully installed 'Microsoft.Bcl.Build 1.0.10'.
Successfully installed 'Microsoft.Bcl 1.1.3'.
Successfully installed 'Microsoft.Net.Http 2.2.13'.
Successfully added 'Microsoft.Bcl.Build 1.0.10' to UnofficialPodio.
Executing script file ***\packages\Microsoft.Bcl.Build.1.0.10\tools\Install.ps1'.
This reference cannot be removed from the project because it is always referenced by the compiler.
This reference cannot be removed from the project because it is always referenced by the compiler.
This reference cannot be removed from the project because it is always referenced by the compiler.
This reference cannot be removed from the project because it is always referenced by the compiler.
Executing script file ***\packages\Microsoft.Bcl.Build.1.0.10\tools\Uninstall.ps1'.
Successfully uninstalled 'Microsoft.Bcl 1.1.3'.
Successfully uninstalled 'Microsoft.Bcl.Build 1.0.10'.
Install failed. Rolling back...
Failed to add reference to 'System.IO'.
Run Code Online (Sandbox Code Playgroud)
"{
    \"access_token\": \"123803120312912j\",
    \"token_type\": \"bearer\",
    \"ref\": {
        \"type\": \"user\",
        \"id\": 123123
    },
    \"expires_in\": 28800,
    \"refresh_token\": \"234234f23f423q432f\"
}"
Run Code Online (Sandbox Code Playgroud)

...

public class Auth
{

    [DataMember(Name = "access_token")]  
    public string AccessToken { get; set; }

    [DataMember(Name = "token_type")]  
    public string TokenType { get; set; }

    [DataMember(Name = "expires_in")]  
    public string ExpiresIn { get; set; }

    [DataMember(Name = "refresh_token")]  
    public string RefreshToken { get; set; }

    //[DataMember(Name = "ref")]  
    //public string Ref { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 5

要获取响应数据,您需要在HttpWebResponse对象上调用GetResponseStream(),然后从流中读取.像这样的东西:

using (Stream s = response.GetResponseStream())
{
    using (TextReader textReader = new StreamReader(s, true))
    {
        jsonString = textReader.ReadToEnd();
    }
}
Run Code Online (Sandbox Code Playgroud)

要从json字符串获取数据,您需要创建一个数据协定类来完整地描述json数据:

    [DataContract]
    public class ApiData
    {
        [DataMember(Name = "name")]  <--this name must be the exact name of the json key
        public string Name { get; set; }

        [DataMember(Name = "description")]
        public string Description { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

接下来,您可以从字符串反序列化json对象:

        using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ApiData));
            ApiData obj = (ApiData)serializer.ReadObject(stream);
            return obj;
        }
Run Code Online (Sandbox Code Playgroud)

WebRequest可以正常工作,但我建议为HttpClient类安装​​NuGet包.它让生活变得更加简单.例如,您可以在几行中创建上述请求代码:

        HttpClient httpClient = new HttpClient();
        HttpRequestMessage msg = new HttpRequestMessage(new HttpMethod("POST"), escapedUrl);
        HttpResponseMessage response = await httpClient.SendAsync(msg);
Run Code Online (Sandbox Code Playgroud)

在回答你下面的问题时,这里是我使用的通用json转换器代码:

public static class JsonHelper
{
    public static T Deserialize<T>(string json)
    {
        using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
            T obj = (T)serializer.ReadObject(stream);
            return obj;
        }
    }

    public static string Serialize(object objectToSerialize)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            DataContractJsonSerializer serializer = new DataContractJsonSerializer(objectToSerialize.GetType());
            serializer.WriteObject(ms, objectToSerialize);
            ms.Position = 0;
            using (StreamReader sr = new StreamReader(ms))
            {
                return sr.ReadToEnd();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)