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

如何序列化含ID/ExternalID的DataTable?PUT能否仅更新变更行?

问题解答

1. 序列化DataTable时同时包含ID和ExternalID的方法

你当前的核心问题是要还原原始API的JSON结构(包含顶层的ID、ExternalID和Rows数组),而非仅序列化DataTable的行数据。这里有两种实用实现方式:

方式一:复用已有的VB.NET类模型

既然你已经基于原始JSON结构创建了对应类模型(假设类名为ApiResponseModel,包含ID、ExternalID和Rows属性,Rows对应行数据的集合类),直接重新组装模型即可:

  • 先把DataTable中的行数据映射为Rows对应的集合类型(通过遍历DataTable逐行转换)
  • 给模型的ID和ExternalID赋值(这两个值需要你在最初请求API时保存下来)
  • 最后序列化这个模型实例,就能得到符合要求的完整JSON

示例VB.NET代码:

' 假设你的类模型定义如下
Public Class ApiResponseModel
    Public Property ID As String
    Public Property ExternalID As String
    Public Property Rows As List(Of RowModel)
End Class

Public Class RowModel
    ' 对应Rows数组中的字段
    Public Property Name As String
    Public Property Value As Integer
    ' 其他业务字段...
End Class

' 组装模型并序列化
Dim responseModel As New ApiResponseModel()
responseModel.ID = "你保存的原始ID"
responseModel.ExternalID = "你保存的原始ExternalID"
' 将DataTable转换为RowModel集合
responseModel.Rows = dt.AsEnumerable().Select(Function(row) New RowModel() With {
    .Name = row.Field(Of String)("Name"),
    .Value = row.Field(Of Integer)("Value")
}).ToList()

' 生成最终JSON
Dim json As String = JsonConvert.SerializeObject(responseModel, Formatting.Indented)

方式二:用JObject手动构建JSON结构

如果不想复用类模型,可直接借助Newtonsoft的JObject来拼接结构:

Dim jsonObj As New JObject()
jsonObj.Add("ID", "你保存的原始ID")
jsonObj.Add("ExternalID", "你保存的原始ExternalID")
' 将DataTable转换为JArray
Dim rowsArray As JArray = JArray.FromObject(dt)
jsonObj.Add("Rows", rowsArray)

' 生成最终JSON
Dim json As String = jsonObj.ToString(Formatting.Indented)

注意:无论哪种方式,你必须在首次获取API数据时保存好ID和ExternalID的值,否则无法回填到JSON结构中。

2. PUT请求会更新所有行还是仅变更行?

这完全由后端REST API的实现逻辑决定:

  • 如果后端PUT接口设计为全量替换:你提交完整的Rows数组后,后端会将数据库中对应数据集的所有行替换为你提交的数据,无论该行是否有变更。哪怕只有一行修改,提交全量数据后后端也会更新所有行。
  • 如果后端支持增量更新:通常需要你只提交变更的行(可通过DataTable的RowState属性筛选出Modified、Added、Deleted状态的行),但这种场景后端一般会用PATCH请求而非PUT,不过也存在部分API允许PUT传递增量数据的情况。

在客户端,你可以通过以下代码筛选出变更的行:

' 筛选已修改、新增、删除的行
Dim changedRows As DataRow() = dt.Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent Or DataViewRowState.Added Or DataViewRowState.Deleted)

但是否只传递这些行,必须严格遵循后端API的文档要求。如果后端仅接受全量数据,你仍需提交完整的Rows数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:20:27