c# - 如何从 SQL Server 2016 中删除 json 子行中的方括号?

标签 c# json sql-server json.net

我对这样的查询的输出有疑问:

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/

相关文章:

java - 构建嵌套的 JSONObject

sql-server - 如何查询当前用户的角色

sql - 如何制定聚合不同值的 SQL Server 索引 View ?

c# - 确定对象是否已在 C# 中被销毁(即不再在任何地方找到)

javascript - 在react中将多个JSON结果渲染到HTML列表

c# - FFMPEG - windows - MJPEG 流 - 转换为 MP4 并重新流式传输 - C# - 新手

json - 使用 "jq"从 JSON 文件导出所需的输出(按正确顺序排列的字段)

sql-server - 通过检查现有数据启用外键

c# - 无法更新 Azure 中的 Azure Function

c# - 如果 C# 中的关键字未在系统类中定义,那么它们在 CLR 中的哪里?