在 C# 中从 SQL 服务器查询 JSON
Query JSON in C# from a SQL Server
我使用 Audit.Net 审核我的 ASP.NET Razor 应用程序,结果以 JSON 格式存储在 SQL 服务器数据库中。 table 的名称称为 AuditTrail,JSON 结果存储在名为 JsonData 的列中。典型的 JSON 输出如下所示:
{
"EventType": "GET /Account/Menu",
"Environment": {
"UserName": "xxx",
"MachineName": "xxx-MacBook-Pro",
"DomainName": "xxx-MacBook-Pro",
"CallingMethodName": "xxx.Areas.Identity.Pages.Account.MenuModel.OnGet()",
"AssemblyName": "xxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"Culture": ""
},
"StartDate": "2020-12-10T14:44:47.067556Z",
"EndDate": "2020-12-10T14:44:47.067788Z",
"Duration": 0,
"Action": {
"TraceId": "xxxx",
"HttpMethod": "GET",
"ControllerName": "Identity",
"ActionName": "/Account/Menu",
"ViewPath": "/Account/Menu",
"ActionParameters": {},
"RequestBody": {},
"ResponseBody": {
"Type": "PageResult"
},
"UserName": "xxx@gmail.com",
"RequestUrl": "https://localhost:5001/Identity/Account/Menu",
"IpAddress": "::1",
"ResponseStatusCode": 200
}
}
我的问题是如何 select 来自 JSON 输出的特定参数,即“Action.UserName”,而不是必须输出整个 JSON 输出,这是它当前所做的,然后将其传递给视图。到目前为止我所做的是将 JSON 输出表示为 class 然后连接到数据库,但它不起作用
public class Action
{
public string TraceId { get; set; }
public string HttpMethod { get; set; }
public string ControllerName { get; set; }
public string ActionName { get; set; }
public string ViewPath { get; set; }
public string UserName { get; set; }
public string RequestUrl { get; set; }
public string IpAddress { get; set; }
public int ResponseStatusCode { get; set; }
}
public class Audits
{
public List<Action> Actions { get; set; }
}
string connectionString = "Data Source=localhost;User ID=sa;Password=xxx;initial
catalog=xxx.db;integrated security=false;";
public string UserName { get; set; }
public string IpAddress { get; set; }
public string HttpMethod { get; set; }
using (SqlConnection connection = new SqlConnection(connectionString))
{
string query = "SELECT JsonData FROM AuditTrail";
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
List<AuditLog> auditLogs1 = new List<AuditLog>();
var reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
AuditLog audit1 = new AuditLog();
audit1.User = reader["JsonData"].ToString();
auditLogs1.Add(audit1);
}
connection.Close();
}
var JsonResult = JsonConvert.SerializeObject(auditLogs1);
var JsonResult1 = JsonConvert.DeserializeObject<Audits>(JsonResult);
foreach (var x in JsonResult1.Actions)
{
UserName = x.UserName;
HttpMethod = x.HttpMethod;
IpAddress = x.IpAddress;
}
}
好的,您可以通过这种方式从您的 JSON 中获取“操作”键:
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
List<AuditLog> auditLogs1 = new List<AuditLog>();
var reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
AuditLog audit1 = new AuditLog();
audit1.User = reader["JsonData"].ToString();
auditLogs1.Add(audit1);
}
connection.Close();
}
var root = JObject.Parse(auditLogs1);
var audit = new Audits() { Actions = new List<Action>() };
var action = root["Action"].ToObject<Action>();
audit.Actions.Add(action);
foreach (var x in audit.Actions)
{
UserName = x.UserName;
HttpMethod = x.HttpMethod;
IpAddress = x.IpAddress;
}
}
有了这个你就可以弄清楚你可能在做什么
在 Sql Server 2016 及更高版本中,您可以通过更新查询来简化此操作:
SELECT
JSON_VALUE(JsonData, '$.Action.UserName') as UserName
,JSON_VALUE(JsonData, '$.Action.HttpMethod') as HttpMethod
,JSON_VALUE(JsonData, '$.Action.IpAddress') as IpAddress
FROM
[dbo].[AuditTrail]
将此应用到您的代码中,您将获得:
List<AuditLog> logs = new List<AuditLog>();
using (SqlConnection connection = new SqlConnection(connectionString))
{
string query = @"SELECT
JSON_VALUE(JsonData, '$.Action.UserName') as UserName
,JSON_VALUE(JsonData, '$.Action.HttpMethod') as HttpMethod
,JSON_VALUE(JsonData, '$.Action.IpAddress') as IpAddress
FROM
[dbo].[AuditTrail]";
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
var reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
logs.Add(new AuditLog
{
UserName = reader["UserName"].ToString(),
HttpMethod = reader["HttpMethod"].ToString(),
IpAddress = reader["IpAddress"].ToString()
});
}
}
}
}
我使用 Audit.Net 审核我的 ASP.NET Razor 应用程序,结果以 JSON 格式存储在 SQL 服务器数据库中。 table 的名称称为 AuditTrail,JSON 结果存储在名为 JsonData 的列中。典型的 JSON 输出如下所示:
{
"EventType": "GET /Account/Menu",
"Environment": {
"UserName": "xxx",
"MachineName": "xxx-MacBook-Pro",
"DomainName": "xxx-MacBook-Pro",
"CallingMethodName": "xxx.Areas.Identity.Pages.Account.MenuModel.OnGet()",
"AssemblyName": "xxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"Culture": ""
},
"StartDate": "2020-12-10T14:44:47.067556Z",
"EndDate": "2020-12-10T14:44:47.067788Z",
"Duration": 0,
"Action": {
"TraceId": "xxxx",
"HttpMethod": "GET",
"ControllerName": "Identity",
"ActionName": "/Account/Menu",
"ViewPath": "/Account/Menu",
"ActionParameters": {},
"RequestBody": {},
"ResponseBody": {
"Type": "PageResult"
},
"UserName": "xxx@gmail.com",
"RequestUrl": "https://localhost:5001/Identity/Account/Menu",
"IpAddress": "::1",
"ResponseStatusCode": 200
}
}
我的问题是如何 select 来自 JSON 输出的特定参数,即“Action.UserName”,而不是必须输出整个 JSON 输出,这是它当前所做的,然后将其传递给视图。到目前为止我所做的是将 JSON 输出表示为 class 然后连接到数据库,但它不起作用
public class Action
{
public string TraceId { get; set; }
public string HttpMethod { get; set; }
public string ControllerName { get; set; }
public string ActionName { get; set; }
public string ViewPath { get; set; }
public string UserName { get; set; }
public string RequestUrl { get; set; }
public string IpAddress { get; set; }
public int ResponseStatusCode { get; set; }
}
public class Audits
{
public List<Action> Actions { get; set; }
}
string connectionString = "Data Source=localhost;User ID=sa;Password=xxx;initial
catalog=xxx.db;integrated security=false;";
public string UserName { get; set; }
public string IpAddress { get; set; }
public string HttpMethod { get; set; }
using (SqlConnection connection = new SqlConnection(connectionString))
{
string query = "SELECT JsonData FROM AuditTrail";
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
List<AuditLog> auditLogs1 = new List<AuditLog>();
var reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
AuditLog audit1 = new AuditLog();
audit1.User = reader["JsonData"].ToString();
auditLogs1.Add(audit1);
}
connection.Close();
}
var JsonResult = JsonConvert.SerializeObject(auditLogs1);
var JsonResult1 = JsonConvert.DeserializeObject<Audits>(JsonResult);
foreach (var x in JsonResult1.Actions)
{
UserName = x.UserName;
HttpMethod = x.HttpMethod;
IpAddress = x.IpAddress;
}
}
好的,您可以通过这种方式从您的 JSON 中获取“操作”键:
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
List<AuditLog> auditLogs1 = new List<AuditLog>();
var reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
AuditLog audit1 = new AuditLog();
audit1.User = reader["JsonData"].ToString();
auditLogs1.Add(audit1);
}
connection.Close();
}
var root = JObject.Parse(auditLogs1);
var audit = new Audits() { Actions = new List<Action>() };
var action = root["Action"].ToObject<Action>();
audit.Actions.Add(action);
foreach (var x in audit.Actions)
{
UserName = x.UserName;
HttpMethod = x.HttpMethod;
IpAddress = x.IpAddress;
}
}
有了这个你就可以弄清楚你可能在做什么
在 Sql Server 2016 及更高版本中,您可以通过更新查询来简化此操作:
SELECT
JSON_VALUE(JsonData, '$.Action.UserName') as UserName
,JSON_VALUE(JsonData, '$.Action.HttpMethod') as HttpMethod
,JSON_VALUE(JsonData, '$.Action.IpAddress') as IpAddress
FROM
[dbo].[AuditTrail]
将此应用到您的代码中,您将获得:
List<AuditLog> logs = new List<AuditLog>();
using (SqlConnection connection = new SqlConnection(connectionString))
{
string query = @"SELECT
JSON_VALUE(JsonData, '$.Action.UserName') as UserName
,JSON_VALUE(JsonData, '$.Action.HttpMethod') as HttpMethod
,JSON_VALUE(JsonData, '$.Action.IpAddress') as IpAddress
FROM
[dbo].[AuditTrail]";
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
var reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
logs.Add(new AuditLog
{
UserName = reader["UserName"].ToString(),
HttpMethod = reader["HttpMethod"].ToString(),
IpAddress = reader["IpAddress"].ToString()
});
}
}
}
}