You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在反序列化为dynamic的JSON数组中匹配路径并获取对应BoxId?

问题

前端将序列化后的JSON数组发送至后端,用于批量导入BoxId到数据库(通过文件路径匹配关联)。前端传来的JSON数据格式如下:

[{"File Type" : "Folder", "File Id" : "dfasf23r", "File Path" : "/dir/test/filename.docx"}, ...]

后端使用以下代码反序列化并处理,但不知道如何在JSON变量中搜索匹配项并获取对应BoxId:

public async Task<IActionResult> BoxIdsImport([FromForm] string jsonData)
{
    dynamic json = JsonSerializer.Deserialize<dynamic>(jsonData);

    String query = "select FILE_ID, (DOCUMENT_PATH + DOCUMENT_FILENAME) as FULL_PATH, BoxID from dbo.DocumentTBL";

    using (var connection = new SqlConnection(connectionStringSandbox))
    {
        var queryResult = await connection.QueryAsync(query);

        foreach(var item in queryResult)
        {
            //此处需在JSON数据中匹配对应的文件路径,获取关联的BoxId并更新至数据库记录
            if(item.FULL_PATH == matched value)
            {
               item.BoxID = the associated box id for the matched record
            }
        }
    }

    return Ok();
}
解决方案

1. 定义强类型实体类替代dynamic

用强类型实体类接收反序列化的JSON,比dynamic更安全、易维护,还能避免类型匹配错误:

public class BoxFileDto
{
    [JsonPropertyName("File Type")]
    public string FileType { get; set; }
    
    [JsonPropertyName("File Id")]
    public string FileId { get; set; } // 对应JSON中的BoxId
    
    [JsonPropertyName("File Path")]
    public string FilePath { get; set; }
}

2. 反序列化并构建路径映射字典

将JSON反序列化为实体列表,再构建以文件路径为键、BoxId为值的字典,这样匹配时的时间复杂度为O(1),大幅提升批量处理效率:

// 替换原dynamic反序列化代码
var boxFiles = JsonSerializer.Deserialize<List<BoxFileDto>>(jsonData);
if (boxFiles == null || !boxFiles.Any())
{
    return BadRequest("无效的JSON数据");
}
var pathToBoxIdMap = boxFiles.ToDictionary(f => f.FilePath, f => f.FileId);

3. 匹配路径并收集待更新数据

遍历数据库查询结果,通过字典快速匹配文件路径,收集需要更新的记录(注意:直接修改内存中的item.BoxID不会同步到数据库,必须执行UPDATE语句):

var updateList = new List<(int FileId, string BoxId)>();

foreach(var item in queryResult)
{
    if(pathToBoxIdMap.TryGetValue(item.FULL_PATH, out var boxId))
    {
        updateList.Add((item.FILE_ID, boxId));
    }
}

4. 批量更新数据库

使用Dapper的批量执行能力,一次性更新所有匹配的记录,减少数据库交互次数:

if(updateList.Any())
{
    var updateQuery = @"
        UPDATE dbo.DocumentTBL 
        SET BoxID = @BoxId 
        WHERE FILE_ID = @FileId";
    
    await connection.ExecuteAsync(updateQuery, updateList);
}

完整修改后的代码

public class BoxFileDto
{
    [JsonPropertyName("File Type")]
    public string FileType { get; set; }
    
    [JsonPropertyName("File Id")]
    public string FileId { get; set; }
    
    [JsonPropertyName("File Path")]
    public string FilePath { get; set; }
}

public async Task<IActionResult> BoxIdsImport([FromForm] string jsonData)
{
    var boxFiles = JsonSerializer.Deserialize<List<BoxFileDto>>(jsonData);
    if(boxFiles == null || !boxFiles.Any())
    {
        return BadRequest("无效的JSON数据");
    }
    
    var pathToBoxIdMap = boxFiles.ToDictionary(f => f.FilePath, f => f.FileId);
    String query = "select FILE_ID, (DOCUMENT_PATH + DOCUMENT_FILENAME) as FULL_PATH from dbo.DocumentTBL";

    using (var connection = new SqlConnection(connectionStringSandbox))
    {
        var queryResult = await connection.QueryAsync(query);
        var updateList = new List<(int FileId, string BoxId)>();

        foreach(var item in queryResult)
        {
            if(pathToBoxIdMap.TryGetValue(item.FULL_PATH, out var boxId))
            {
                updateList.Add((item.FILE_ID, boxId));
            }
        }

        if(updateList.Any())
        {
            var updateQuery = @"
                UPDATE dbo.DocumentTBL 
                SET BoxID = @BoxId 
                WHERE FILE_ID = @FileId";
            
            await connection.ExecuteAsync(updateQuery, updateList);
        }
    }

    return Ok("批量更新完成");
}

内容的提问来源于stack exchange,提问作者Qiuzman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 21:32:49