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

Xamarin.Forms中如何反序列化从WebService获取的Dataset?

搞定Xamarin.Forms中的DataSet JSON反序列化问题

嘿,作为Xamarin.Forms新手碰到这种DataSet格式的JSON反序列化问题太正常了!我来一步步帮你解决这个问题。

首先先分析你拿到的JSON结构:它本质是一个包含3个DataTable的DataSet,外层是一个大数组,每个子数组对应一个DataTable:

  • 第一个子数组:存储错误状态信息
  • 第二个子数组:存储问卷问题列表
  • 第三个子数组:存储问题对应的选项列表

json2csharp工具处理不了这种结构是因为它没法自动识别无键名的嵌套数组对应DataSet的多个表,所以我们手动定义实体类再拆分反序列化就好。

第一步:定义对应每个DataTable的C#实体类

根据每个表的字段,创建三个实体类:

// 错误信息表实体
public class ErrorInfo
{
    public bool bit_HasError { get; set; }
    public string vchar_ErrorMsg { get; set; }
}

// 问卷问题表实体
public class SurveyQuestion
{
    public int int_SurveyQuestionID { get; set; }
    public string vchar_Description { get; set; }
    public string vchar_Instruction { get; set; }
    public int int_AnswerType { get; set; }
}

// 问题选项表实体
public class SurveyOption
{
    public int int_SurveyQuestionID { get; set; }
    public string vchar_Option { get; set; }
}

第二步:用Newtonsoft.Json进行反序列化

Xamarin.Forms中最常用的JSON库就是Newtonsoft.Json(如果还没装,直接在NuGet包管理器里搜索安装就行)。我们先把整个JSON解析成JArray,再逐个提取每个DataTable的内容转换成对应的实体列表:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

// 假设你从WebService获取到的JSON字符串存在jsonString变量中
JArray dataSetArray = JArray.Parse(jsonString);

// 提取第一个表:错误信息
var errorInfoList = dataSetArray[0].ToObject<List<ErrorInfo>>();
ErrorInfo errorStatus = errorInfoList.FirstOrDefault();

// 提取第二个表:问卷问题列表
var surveyQuestions = dataSetArray[1].ToObject<List<SurveyQuestion>>();

// 提取第三个表:问题选项列表
var surveyOptions = dataSetArray[2].ToObject<List<SurveyOption>>();

这样处理后,你就可以像操作普通C#对象一样使用这些数据了——比如遍历surveyQuestions展示问卷,或者根据int_SurveyQuestionID关联问题和选项。

额外提示

如果你的项目更倾向于使用System.Text.Json(.NET Core/.NET 5+的内置JSON库),代码逻辑类似,只是需要用JsonDocument来解析:

using System.Text.Json;

using (JsonDocument doc = JsonDocument.Parse(jsonString))
{
    JsonElement root = doc.RootElement;
    
    // 提取错误信息
    var errorInfoList = JsonSerializer.Deserialize<List<ErrorInfo>>(root[0]);
    
    // 提取问卷问题
    var surveyQuestions = JsonSerializer.Deserialize<List<SurveyQuestion>>(root[1]);
    
    // 提取选项
    var surveyOptions = JsonSerializer.Deserialize<List<SurveyOption>>(root[2]);
}

内容的提问来源于stack exchange,提问作者A for android

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:48:54