我对这样的查询的输出有疑问:
SELECT
Users.Id,
Users.FbId,
Users.Email,
Users.Nombre,
(SELECT * FROM AccessLevel WHERE AccessLevel.Id = Users.NivelAcceso FOR JSON PATH) AS NivelAcceso,
(SELECT * FROM UserStatus WHERE UserStatus.Id = Users.Estatus FOR JSON PATH) AS Estatus
FROM
Users
WHERE
Users.Id = 1
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER;
结果是这样的:
{
"Id": 1,
"Email": "some@email.com",
"NivelAcceso": [
{
"Id": 1,
"Clave": "Usuario"
}
],
"Estatus": [
{
"Id": 1,
"Estatus": "Activo"
}
]
}
问题是当我在 C# 中使用 Newtonsoft 反序列化时,无法解析“NivelAcceso”和“Estatus”中的方括号,因为 Newtonsoft 认为它是一个数组。
我的 C# 类是这样的:
public class AccessLevel
{
[JsonProperty(PropertyName = "Id")]
public int Id { get; set; }
[JsonProperty(PropertyName = "Clave")]
public string Clave { get; set; }
[JsonProperty(PropertyName = "Descripcion")]
public string Descripcion { get; set; }
}
public class UserStatus
{
[JsonProperty(PropertyName = "Id")]
public int Id { get; set; }
[JsonProperty(PropertyName = "Estatus")]
public string Estatus { get; set; }
[JsonProperty(PropertyName = "Descripcion")]
public string Descripcion { get; set; }
}
public class Users
{
public long Id { get; set; }
public string Email { get; set; }
[JsonProperty(PropertyName = "NivelAcceso")]
public AccessLevel NivelAcceso { get; set; }
[JsonProperty(PropertyName = "Estatus")]
public UserStatus Estatus { get; set; }
}
实际上我正在使用这样的东西:
Users data = JsonConvert.DeserializeObject<Users>(_dataReader[0].ToString().Replace('[', '\0').Replace(']', '\0'));
任何人都可以帮助我如何反序列化它?
最佳答案
在您的子查询中,您还需要指定 WITHOUT_ARRAY_WRAPPER 修饰符
SELECT
Users.Id,
...
(SELECT * FROM AccessLevel WHERE AccessLevel.Id = Users.NivelAcceso FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) AS NivelAcceso,
但是当您这样做时,外部 JSON 会将您的“NivelAcceso”字段视为纯字符串而不是 json 对象。要解决此问题,请使用 JSON_QUERY功能
SELECT
Users.Id,
...
JSON_QUERY((SELECT * FROM AccessLevel WHERE AccessLevel.Id = Users.NivelAcceso FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)) AS NivelAcceso,
...
FROM Users
WHERE Users.Id = 1
FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER;
关于c# - 如何从 SQL Server 2016 中删除 json 子行中的方括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53563039/