You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将Azure ML WS返回的DataTable字符串转换为C# DataTable对象?

解决方案:将Azure ML WS的DataTable输出字符串转为POCO对象

你完全不用手动写解析器!有几个更简便的方式,都是基于JSON序列化库的现成能力,我自己在项目里用过,分享给你:

1. 用Newtonsoft.Json直接反序列化(最常用)

首先你要根据Azure ML返回的DataTable结构,定义一个对应的POCO类,属性名要和DataTable的列名一致(如果名字不匹配,可以用[JsonProperty("列名")]来映射)。比如你的DataTable有IdPredictionScore这几列,POCO类就这么写:

public class PredictionResult
{
    public int Id { get; set; }
    public string Prediction { get; set; }
    public double Score { get; set; }
}

然后直接用Newtonsoft.Json的反序列化方法,把拿到的输出字符串转成对象(或者对象列表,如果是多行DataTable):

using Newtonsoft.Json;

// 如果是单行数据
var result = JsonConvert.DeserializeObject<PredictionResult>(yourAzureMLOutputString);

// 如果是多行数据(DataTable一般是集合)
var resultList = JsonConvert.DeserializeObject<List<PredictionResult>>(yourAzureMLOutputString);

如果你的DataTable列是动态的(每次返回的列可能不一样),可以用ExpandoObject或者dynamic类型来接收,不过这种情况不如强类型POCO好维护。

2. 用System.Text.Json(.NET Core/.NET 5+推荐)

如果你用的是较新的.NET版本,推荐用内置的System.Text.Json,用法和Newtonsoft类似,先定义POCO类,然后:

using System.Text.Json;

var options = new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true, // 忽略大小写,避免列名和属性名大小写不匹配的问题
    IgnoreNullValues = true
};

var result = JsonSerializer.Deserialize<PredictionResult>(yourAzureMLOutputString, options);

3. 借助Azure ML SDK直接读取(如果是从作业/端点获取输出)

如果你是从Azure ML的批量作业或者实时端点获取的DataTable输出,其实可以不用自己处理字符串,直接用Azure ML SDK的方法读取成强类型对象。比如用Azure.AI.MachineLearning库,在获取作业输出的时候,指定要反序列化的类型:

using Azure.AI.MachineLearning;

var mlClient = new MachineLearningClient(new Uri(endpoint), credential);
var job = await mlClient.Jobs.GetAsync(jobId);

// 读取输出并直接转为POCO列表
var results = job.Outputs["output_name"].ReadAsAsync<List<PredictionResult>>().Result;

这种方式最省心,完全跳过了手动处理JSON字符串的步骤。

注意事项

  • 确保POCO类的属性类型和DataTable列的类型匹配,比如DataTable里的float对应C#的floatdoubledatetime对应DateTime等。
  • 如果DataTable里有嵌套的复杂结构,需要在POCO里定义对应的嵌套类。

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

火山引擎 最新活动