从 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;
}
我面临以下问题:
- 我无法映射文件 userData.json,我尝试了 Server.MapPath 但它看起来不可用,httpcontext 也不起作用。
- 我不明白如何从这个 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();
}
结果:
我是 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;
}
我面临以下问题:
- 我无法映射文件 userData.json,我尝试了 Server.MapPath 但它看起来不可用,httpcontext 也不起作用。
- 我不明白如何从这个 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();
}
结果: