C# JSON 解析结果似乎为空

Posted

技术标签:

【中文标题】C# JSON 解析结果似乎为空【英文标题】:C# JSON Parsing result seems to be null 【发布时间】:2020-12-30 19:21:14 【问题描述】:

我目前正在制作一个使用 Advice API 的简单程序。这个想法是,当有人按下按钮时,会出现一串建议。但是,我有一个问题,我可以打印原始 JSON 响应,但不能打印单个建议字符串本身。

标签仅用于调试目的。

任何帮助将不胜感激! :)

public void Search_Click(object sender, EventArgs e)

    HttpClient client = new HttpClient();
    HttpResponseMessage response = client.GetAsync(apiURL).Result;
    string rawtext = response.Content.ReadAsStringAsync().Result;

    label2.Text = rawtext;

    Todo todo = JsonConvert.DeserializeObject<Todo>(rawtext);

    label1.Text = todo.advice;


public class Todo

    public int id  get; set; 
    public string advice  get; set; 

JSON:

"slip":  "id": 101, "advice": "Alway do anything for love, but don't do that."

【问题讨论】:

请出示json。 注意:HttpClient 旨在为每个应用程序实例化一次,而不是每次使用。 JSON 已添加 【参考方案1】:

你需要一个关于 json 结构的容器类。我还修复了一些 HttpClient 使用错误。

private static HttpClient client = new HttpClient();

public async void Search_Click(object sender, EventArgs e)

    using (HttpResponseMessage response = await client.GetAsync(apiURL))
    
        string rawtext = await response.Content.ReadAsStringAsync();
        
        label2.Text = rawtext;

        if (response.IsSuccessStatusCode)
        
            Todo todo = JsonConvert.DeserializeObject<Slip>(rawtext).slip;

            label1.Text = todo.advice;
        
    


public class Slip

    public Todo slip  get; set; 


public class Todo

    public int id  get; set; 
    public string advice  get; set; 

【讨论】:

@Moseph 建议:现在方法是async,这意味着 UI 将在数据加载时响应(这是一件好事)。为防止在按钮执行其代码时单击两次,请在开始时禁用按钮并在方法结束时启用。【参考方案2】:

ToDo 嵌套在slip 中,所以你需要一个父类。

Slip slip = JsonConvert.DeserializeObject<Slip>(rawtext);

public class Slip

    public Todo slip  get; set; 


public class Todo

    public int id  get; set; 
    public string advice  get; set; 

【讨论】:

以上是关于C# JSON 解析结果似乎为空的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中动态转换来自 Json.NET 的解析 JSON 结果?

C# 中的 Google 地理编码 Json 解析问题

C# 使用 Newtonsoft 解析 JSON

在 C# 中解析 JSON

c# 解析JSON的几种办法

php json_decode();解析出布尔值true是1,false为空,怎么解决?