Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在web api上显示Json对象?_C#_Asp.net_Json_Asp.net Core - Fatal编程技术网

C# 如何在web api上显示Json对象?

C# 如何在web api上显示Json对象?,c#,asp.net,json,asp.net-core,C#,Asp.net,Json,Asp.net Core,我正在开发一个ASP.NET Web Api,但在如何向Api显示数据方面遇到了一个问题 为了解释我需要弄明白什么。在从Json文件访问对象之后,我相信我应该能够在api上显示这些对象 例如,无论我请求哪个字段,它都应该返回按该字段排序的结果。 现在我需要在不同的端口显示这些数据。比如说 https://host:port/api/books 返回所有未排序的(Book1-Book13) https://host:port/api/books/id 返回按id排序的所有内容(Book1-Boo

我正在开发一个ASP.NET Web Api,但在如何向Api显示数据方面遇到了一个问题

为了解释我需要弄明白什么。在从Json文件访问对象之后,我相信我应该能够在api上显示这些对象

例如,无论我请求哪个字段,它都应该返回按该字段排序的结果。 现在我需要在不同的端口显示这些数据。比如说

  • https://host:port/api/books 返回所有未排序的(Book1-Book13)
  • https://host:port/api/books/id 返回按id排序的所有内容(Book1-Book13)
  • https://host:port/api/books/id/1 返回id包含“1”且按id排序的所有(Book1,Book10-13)
我遵循了这一点,应用程序似乎正在启动和使用不同的端口

这是我在控制器类中设置的代码
BooksController.cs

 [Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
    [HttpGet]
    public ActionResult GetAllBooks()
    {
        string[] books = { "book1", "book2", "book3" };

        if (!books.Any())
            return NotFound();
        return Ok(books);
    }

    [HttpGet("id/{id}")]
    public string GetBookById(int id)
    {

        return $"book: {id}";
    }

    [HttpGet("author/{author}")]
    public string GetBookByAuthor(string author)
    {
        return $"author: {author}";
    }
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        GetAllBooks();
    }
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<TodoContext>(opt =>
                                           opt.UseInMemoryDatabase("TodoList"));
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();
        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }

    
    public void GetAllBooks()
    {
        string _path = $"C:\\Users\\filip\\source\\repos\\NexerGroupApi\\NexerGroupApi\\books.json";

        string jsonFromFile;
        using (var reader = new StreamReader(_path))
        {
            jsonFromFile = reader.ReadToEnd();
        }

        var booksFromJsonFile = JsonConvert.DeserializeObject<List<NexerGroupApi.Book>>(jsonFromFile);

        JArray bookArray = JArray.FromObject(booksFromJsonFile);

        IList<Book> bookList= bookArray.Select(p => new Book
        {
            Id = (string)p["Id"],
            Author = (string)p["Author"],
            Title = (string)p["Title"],
            Genre = (string)p["Genre"],
            Price = (string)p["Price"],
            Publish_date = (string)p["Publish_date"],
            Description = (string)p["Description"]
        }).ToList();
    }

    public class Book
    {
        public string Id { get; set; }
        public string Author { get; set; }
        public string Title { get; set; }
        public string Genre { get; set; }
        public string Price { get; set; }
        public string Publish_date { get; set; }
        public string Description { get; set; }
    }
这是我的
startup.cs

 [Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
    [HttpGet]
    public ActionResult GetAllBooks()
    {
        string[] books = { "book1", "book2", "book3" };

        if (!books.Any())
            return NotFound();
        return Ok(books);
    }

    [HttpGet("id/{id}")]
    public string GetBookById(int id)
    {

        return $"book: {id}";
    }

    [HttpGet("author/{author}")]
    public string GetBookByAuthor(string author)
    {
        return $"author: {author}";
    }
public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        GetAllBooks();
    }
    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<TodoContext>(opt =>
                                           opt.UseInMemoryDatabase("TodoList"));
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();
        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }

    
    public void GetAllBooks()
    {
        string _path = $"C:\\Users\\filip\\source\\repos\\NexerGroupApi\\NexerGroupApi\\books.json";

        string jsonFromFile;
        using (var reader = new StreamReader(_path))
        {
            jsonFromFile = reader.ReadToEnd();
        }

        var booksFromJsonFile = JsonConvert.DeserializeObject<List<NexerGroupApi.Book>>(jsonFromFile);

        JArray bookArray = JArray.FromObject(booksFromJsonFile);

        IList<Book> bookList= bookArray.Select(p => new Book
        {
            Id = (string)p["Id"],
            Author = (string)p["Author"],
            Title = (string)p["Title"],
            Genre = (string)p["Genre"],
            Price = (string)p["Price"],
            Publish_date = (string)p["Publish_date"],
            Description = (string)p["Description"]
        }).ToList();
    }

    public class Book
    {
        public string Id { get; set; }
        public string Author { get; set; }
        public string Title { get; set; }
        public string Genre { get; set; }
        public string Price { get; set; }
        public string Publish_date { get; set; }
        public string Description { get; set; }
    }
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
GetAllBooks();
}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
services.AddDbContext(opt=>
选择使用MemoryDatabase(“TodoList”);
services.AddControllers();
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(端点=>
{
endpoints.MapControllers();
});
}
公共无效GetAllBooks()
{
字符串_path=$“C:\\Users\\filip\\source\\repos\\nexrgroupapi\\nexrgroupapi\\books.json”;
字符串jsonFromFile;
使用(var reader=newstreamreader(_path))
{
jsonFromFile=reader.ReadToEnd();
}
var booksFromJsonFile=JsonConvert.DeserializeObject(jsonFromFile);
JArray bookArray=JArray.FromObject(booksFromJsonFile);
IList bookList=bookArray.Select(p=>newbook
{
Id=(字符串)p[“Id”],
Author=(字符串)p[“Author”],
Title=(字符串)p[“Title”],
流派=(字符串)p[“流派”],
价格=(字符串)p[“价格”],
发布日期=(字符串)p[“发布日期”],
Description=(字符串)p[“Description”]
}).ToList();
}
公共课堂用书
{
公共字符串Id{get;set;}
公共字符串作者{get;set;}
公共字符串标题{get;set;}
公共字符串类型{get;set;}
公共字符串Price{get;set;}
公共字符串发布日期{get;set;}
公共字符串说明{get;set;}
}
我想知道我在哪里设置了我的
GetAllBooks()
方法,这样我就可以在
BooksController.cs
中访问它们,并能够从JSonfile中执行api/books/bookmanemfromJSonfile并显示特定对象及其所有内容,如id、作者、标题、流派等


我知道类
startup.cs
中我的
IList图书列表
不起作用,出于某种原因,每个变量get的null值都不起作用。尽管不确定原因。

正如错误所示,您有两条路径是不明确的
[HttpGet({id}])
[HttpGet({author}]]]

给定

点击api/books/1时,
1
可能是作者或图书ID

考虑将author方法的路径更改为:
[HttpGet(“author/{author}”)]

因此,请求将按如下方式发送:

api/books/1
将调用
GetBookById

api/books/author/jsmith
将调用
GetBookByAuthor

编辑:添加列表筛选:

要从
列表中查找
书籍
,可以执行以下操作:

private readonly List<Book> _bookList; //populate this with books from json file

[HttpGet("{id}")]
public IActionResult GetBookById(int id)
{
    var book = GetBookObjectById(id);
    if(book is null) return NotFound();
    return Ok(book);
}

private Book GetBookObjectById(int id)
{
    return _bookList.FirstOrDefault(book => book.Id == id);
}

private Book GetBookObjectByAuthor(string author)
{
    return _bookList.FirstOrDefault(book => book.Author == author);
}
private readonly List\u bookList;//使用json文件中的书籍填充此列表
[HttpGet(“{id}”)]
公共IActionResult GetBookById(内部id)
{
var book=GetBookObjectById(id);
如果(book为null),则返回NotFound();
返回Ok(书本);
}
私人书籍GetBookObjectById(int id)
{
返回_bookList.FirstOrDefault(book=>book.Id==Id);
}
私人书籍GetBookObjectByAuthor(字符串作者)
{
返回_bookList.FirstOrDefault(book=>book.Author==Author);
}

@mason好的,我现在正在看一些教程--我会更新我的问题,也许你可以回答这个问题?你不需要为每一本书设置一条单独的路线。你需要对路线进行结构化,以获得参数。检查。@mason好的,我已经检查了该链接和youtube视频。据我所知,我然后我做了例如[HttpGet(“{id}”)],然后我用这个方法循环我的书,然后如果我输入“api/book/2,它将检索id=2的书。它工作了吗,这样我就可以执行[HttpGet({author}”)]如果我有一个字符串作者,那么如果我使用api/books/authorname,我实际上会收到该作者的书?我编辑了这个问题,以向您展示我认为可行的方法。我的startup.cs中是否存在导致此错误代码的问题?这是您的路由定义。如错误所述,您的路由匹配多个端点。最有可能是y它很疯狂,因为它不知道对像
/api/books/1
这样的URL点击哪个操作方法,它不知道
1
是Id还是作者。对于GetBookByAuthor,您可以将其更改为
[HttpGet(“Author/{Author}]
,然后希望按作者查找书籍的人将点击URL
/api/books/author/Tom%20Clancy
,并将GetBookById更改为
[HttpGet(“id/{id}”)]
,这样他们就可以点击URL
/api/books/id/1
,这就很明确了