【问题标题】:UWP and Json parsingUWP 和 Json 解析
【发布时间】:2016-11-08 19:27:21
【问题描述】:

我有这样的方法:

public static async void DoSomething()
{
    try
    {
        var client = new HttpClient();
        var url = "http://10.0.0.68/SET Initialization";
        var url2 = "http://10.0.0.68/GET Status";
        var response = await client.GetAsync(url);
        Debug.WriteLine(response);
        response = await client.GetAsync(url2);
        Debug.WriteLine(response);
        var result =await response.Content.ReadAsStringAsync();
        var jsonString = result.Substring(4);
        var serializer = new DataContractJsonSerializer(typeof(MediaStatus));
        var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
        var data = (MediaStatus)serializer.ReadObject(ms);
        Debug.Write(data.ProgNo);
    }
    catch (Exception exception)
    {
        Debug.WriteLine(exception.Message, exception.Source);
    }
}

MediaStatus.cs

[DataContract]
public class MediaStatus
{
    [DataMember(Name = "progNo")]
    public int ProgNo { get; set; }
    [DataMember(Name = "index")]
    public int Index { get; set; }
    [DataMember(Name = "type")]
    public string Type { get; set; }
    [DataMember(Name = "group")]
    public int Group { get; set; }
    [DataMember(Name = "msg")]
    public string Msg { get; set; }
    [DataMember(Name = "secondGroup")]
    public int SecondGroup { get; set; }
    [DataMember(Name = "playFlag")]
    public int PlayFlag { get; set; }
}

我只是简单地称呼它:

common.DoSomething();

我的问题是,有时代码运行良好并且会给我结果,但有时我会出错:

抛出异常:System.Private.DataContractSerialization.dll 中的“System.Runtime.Serialization.SerializationException” System.Private.DataContractSerialization:期待来自命名空间“”的元素“根”。遇到名称为“”,命名空间“”的“无”。

我必须用不同的网址调用两次await client.GetAsync

  1. 说我想和他谈谈的服务器
  2. 获取状态信息

【问题讨论】:

  • 你在异步方法中,你为什么使用 .Result 而不是 await?无论如何,发布它抛出的Json。你可能没有得到任何返回的 Json 导致它抛出。
  • 你好,谢谢回复,我改成:var result =await response.Content.ReadAsStringAsync();但没有帮助
  • 可能是格式错误的 JSON。您可以发布 JSON 本身吗?
  • 是的,你是对的,问题不在我这边,而是在服务器端,有时会返回错误的json字符串...
  • result.Substring(4); 是干什么用的?是剥离字节序标记吗?如果是这样,为什么不直接将await response.Content.ReadAsStreamAsync() 的返回值传递给ReadObject()?内部阅读器应使用 BOM 并相应地设置编码。

标签: c# json async-await uwp


【解决方案1】:

这是您调用即发即弃的经典问题,因为您的DoSomething 方法定义为async void。应该标记为void 方法的唯一入口点是事件处理程序等。这个方法应该是 Task 像这样返回:

public static async Task DoSomethingAsync()
{
    try
    {
        using (var client = new HttpClient())
        {
            var url = "http://10.0.0.68/SET Initialization";
            var url2 = "http://10.0.0.68/GET Status";
            var response = await client.GetAsync(url);
            Debug.WriteLine(response);
            response = await client.GetAsync(url2);
            Debug.WriteLine(response);
            var result = await response.Content.ReadAsStringAsync();
            var jsonString = result.Substring(4);
            var serializer = new DataContractJsonSerializer(typeof(MediaStatus));
            var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
            var data = (MediaStatus)serializer.ReadObject(ms);
            Debug.Write(data.ProgNo);
        }
    }
    catch (Exception exception)
    {
        Debug.WriteLine(exception.Message, exception.Source);
    }
}

此外,该方法应具有“Async”后缀,以清楚地表明该方法是异步的。同样,我更改了 HttpClient 的使用,使其包含在 using 语句中,因为它实现了 IDisposable 接口。

如果您需要从事件处理程序调用此方法,下面是从 .Loaded 事件执行此操作的示例:

private async void OnLoaded(object sender, RoutedEventArgs e) => 
    await common.DoSomethingAsync();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2016-11-04
    • 2017-05-31
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多