从 MVC .Net 核心控制器读取 JSON 时出现问题

Posted

技术标签:

【中文标题】从 MVC .Net 核心控制器读取 JSON 时出现问题【英文标题】:Problem Reading JSON from MVC .Net Core Controller 【发布时间】:2021-11-06 15:10:35 【问题描述】:

我在 ASP.Net Core 5 中有一个 Web 应用程序,它也使用 .Net Core 中的 Web API。它以 JSON 格式返回的内容必须从名为landing.js 的文件中读取。问题是数据到达变量(数据)但我无法访问它的方法,它总是设计未定义

我会从控制器以 String 形式返回结果吗?它实际上应该以 JSON 格式到达 JS。

我的控制器:

public async Task<IActionResult> GetPodcastLandingPortada()
    
        List<PPodcast> ppodcastPortada = new List<PPodcast>();
        string jsonresultado = "";

        using (var httpClient = new HttpClient())
        
            using (var response = await httpClient.GetAsync("https://localhost:44379/api/Podcast/ObtenerPodcastPortadaPrincipal"))
            
                string apiResponse = await response.Content.ReadAsStringAsync();
                //ppodcastPortada = JsonConvert.DeserializeObject<List<PPodcast>>(apiResponse);
                jsonresultado = JsonConvert.DeserializeObject(apiResponse).ToString();
            
        
        return Ok(jsonresultado);

    

我的文件landing.js

   window.onload = function () 
_getPortadaPrincipal();

函数 _getPortadaPrincipal()

let ruta = '/podcast/GetPodcastLandingPortada';
$.ajax(
    type: 'GET',
    url: ruta,
    contentType: JSON,
    processData: false,
    success: function (data) 
        console.log(data.titulo); //this is where it returns undefinned, but the data variable is loaded


        $("#portadaPrincipal").html(row);
        console.log(data);

    ,
    error: function () 
        alert("Error en la carga de la Portada");
    ,
);

【问题讨论】:

嗨@Daniel Lazarte,你为什么要反序列化json并将反序列化的模型解析为字符串?为什么不直接使用apiResponse?您还需要首先检查成功功能中的data是什么。 @Rena 你好,那么正确的方法是什么?是,如果我不返回字符串,它永远不会发生 Return 嗨@Daniel Lazarte,只需return Ok(apiResponse); 并将其移到using 中的string apiResponse = await response.Content.ReadAsStringAsync(); 之后。 另外,能否请您在成功功能中分享您的数据? 如果它有效,你是对的,我将它转换为无意义的字符串。非常感谢您的赞赏。 【参考方案1】:

首先,你做了一个重复的事情来返回一个 json。因此,您只需 return Ok(apiResponse); 并将其移动到 using 中的 string apiResponse = await response.Content.ReadAsStringAsync(); 之后:

using (var response = await httpClient.GetAsync("https://localhost:44379/api/Podcast/ObtenerPodcastPortadaPrincipal"))

     string apiResponse = await response.Content.ReadAsStringAsync();
     return Ok(apiResponse);

其次,如果要获取json中的item值,还需要将json转换为js中的object。

因此,获取项目响应的正确方法应该如下所示:

public async Task<IActionResult> GetPodcastLandingPortada()

    using (var httpClient = new HttpClient())
    
        using (var response = await httpClient.GetAsync("url"))
        
            string apiResponse = await response.Content.ReadAsStringAsync();
            var model = JsonConvert.DeserializeObject<List<PPodcast>(apiResponse);
            return Ok(model);
        
    

然后就可以拿到物品了:

console.log(data[0].xxx);  //because what you return is an array

【讨论】:

优秀。 ahora si funciona。 Muchas Gracias =) @Rena 嗨@DanielLazarte,如果我的回答帮助您解决了您的问题,您能接受吗?请参阅:How to accept as answer。谢谢。 如果重生,能否给我解释一下,我在哪一部分接受它作为最终答案? 嗨@DanielLazarte,您可以参考此链接以了解如何接受答案:meta.stackexchange.com/a/5235/673311

以上是关于从 MVC .Net 核心控制器读取 JSON 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 核心 POST 请求未将 JSON 数据转换为模型

现在可以在从 Windows 任务调度程序运行 .net 核心控制台应用程序时读取 appsettings.json 文件中存在的连接字符串

将 JSON 从视图发送到控制器 ASP.NET MVC 会给出空值

如何从 ASP.NET MVC 控制器方法返回由 JSON.NET 序列化的 camelCase JSON?

Asp.net core MVC post 参数始终为空

如何从 ASP.NET MVC 控制器的局部视图中读取值