从 ASP.net Core (v2.1) WebAPI 中的 JSON 文件中读取记录

Read records from JSON file in ASP.net Core (v2.1) WebAPI

我是 asp.net 核心 WebApi 的新手,我正在尝试从有效的 json 文件中读取数据,该文件保存在我的 webapi[= 中名为 mydata 的文件夹中14=]

/mydata/userData.json

userData.json:

{
    "users": [
        {
            "id": 1,
            "firstName": "John",
            "lastName": "Doe"
        },
        {
            "id": 2,
            "firstName": "Jane",
            "lastName": "Doe"
        }
}

我写了一个 web 方法,它将输入作为名字,returns 单个用户对象(第一个找到的记录包含多个结果)。

UserController.cs:

[Route("user/{firstName}")]  
public User GetUser(string firstName)  
{  
using (StreamReader r = new StreamReader("~/mydata/userData.json"))
    {
         string json = r.ReadToEnd();
         User item =JsonConvert.DeserializeObject<User>(json);
    }
    var user = User; 
    return user;  
} 

我面临以下问题:

  1. 我无法映射文件 userData.json,我尝试了 Server.MapPath 但它看起来不可用,httpcontext 也不起作用。
  2. 我不明白如何从这个 api 中 return 一个用户对象,它将在 React 应用程序中使用。

首先,在 asp.net 核心中,您只能(默认情况下)从 wwwroot 文件夹中读取数据。如果你想改变它,那么 .

其次,您试图只读取单个对象,但在您的 json 文件中,有多个用户对象。您可以通过将代码 User item =JsonConvert.DeserializeObject<User>(json); 替换为 List<User> items = JsonConvert.DeserializeObject<List<User>>(json);

来解决此问题

最后,如评论中所述,当您使用 StreamRead 时,您引用了错误的文件...此外,如果您

会更好

希望我有所帮助!

您可以通过使用IHostingEnvironment 获取根路径和Path.Combine() 方法来实现。所以你的控制器应该是这样的:

public class UserController : Controller
{
    private readonly IHostingEnvironment _hostingEnvironment;

    public UserController(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }

    [Route("user/{firstName}")]
    public User GetUser(string firstName)
    {
        var rootPath = _hostingEnvironment.ContentRootPath; //get the root path

        var fullPath = Path.Combine(rootPath, "mydata/user.json"); //combine the root path with that of our json file inside mydata directory

        var jsonData = System.IO.File.ReadAllText(fullPath); //read all the content inside the file

        if (string.IsNullOrWhiteSpace(jsonData)) return null; //if no data is present then return null or error if you wish

        var users = JsonConvert.DeserializeObject<List<User>>(jsonData); //deserialize object as a list of users in accordance with your json file

        if (users == null || users.Count == 0) return null; //if there's no data inside our list then return null or error if you wish

        var user = users.FirstOrDefault(x => x.FirstName == firstName); //filter the list to match with the first name that is being passed in

        return user;

    }
}

请注意: IHostingEnvironment 将在未来的版本中删除,所以如果你可以升级你的框架,那么就这样做,这样你就可以使用推荐的 IWebHostEnvironment类型。

1-) 示例路径;

StreamReader r = new StreamReader(@"C:\Users\Suleyman\Desktop\users.json");

2-) 样本;

  public List<User> GetUser(string firstName){}


List<User> item = JsonConvert.DeserializeObject<List<User>>(json);

这是一个工作演示:

/mydata/userData.json:

{
  "users": [
    {
      "id": 1,
      "firstName": "John",
      "lastName": "Doe"
    },
    {
      "id": 2,
      "firstName": "Jane",
      "lastName": "Doe"
    }
  ]
}

项目结构:

型号:

public class User
    {
        public List<UserModel> users { get; set; }
    }
    public class UserModel
    {
        public int id { get; set; }
        public string firstName { get; set; }
        public string lastName { get; set; }


    }

动作:

[Route("user/{firstName}")]
        public User GetUser(string firstName)
        {
            using (StreamReader r = new StreamReader("mydata/userData.json"))
            {
                string json = r.ReadToEnd();
                User item = JsonConvert.DeserializeObject<User>(json);
                return item;
            }
            return new User();
           
        }

结果: