如何将 JSONString 解析为数据集?
Posted
技术标签:
【中文标题】如何将 JSONString 解析为数据集?【英文标题】:How to parse a JSONString To Dataset? 【发布时间】:2013-10-08 18:48:50 【问题描述】:我正在使用 Web 服务创建 C# 应用程序。在我的 Web 服务中,我使用了 JSONString
数据。
但我无法将此字符串转换为DataSet
。
我的JSONString
是:
"Table": [
"DisplayVoucherNumber": "A101239Z",
"ActualDate": "08/07/2013",
"AccountName": "shyamal",
"Pcs": "50",
"Weight": "500.000"
],
"Table1": [
"DisplayVoucherNumber": "R101249B",
"ActualDate": "11/07/2013",
"AccountName": "vipul",
"NetWeight": "90.000",
"Weight": "80.000",
"Difference": "10.000"
,
"DisplayVoucherNumber": "R101249B",
"ActualDate": "11/07/2013",
"AccountName": "vipul",
"NetWeight": "500.000",
"Weight": "100.000",
"Difference": "400.000"
]
【问题讨论】:
我曾尝试将 JSONString 转换为 DataSet 并将 Dataset 值绑定在 Table 中。 它显然不会反序列化为数据集......它看起来像一个集合名称值对集合 那么如何从 JSONString 绑定表中的数据。在这里,我使用多个表来 JSONString。 C# 会自动将 JSON 反序列化为对象。我建议创建一个对象。您提供的示例字符串将被反序列化为 List 另见这个答案 ***.com/questions/11981282/convert-json-to-datatable 【参考方案1】:你的问题不是很清楚。我想您想要做的是取回一个可以在反序列化后映射到您的数据集的对象。 类似的东西
DataSet myDataSet= JsonConvert.DeserializeObject<DataSet>(jsonstring)
然后你继续用你的数据集进行编码。就像访问数据集中的数据表一样。
如果这是您想要实现的目标,并且不想按照先前答案的建议使用您自己的 POCO。 您可能需要先创建一个 Typed DataSet
给定一个符合 XML 架构定义语言 (XSD) 标准的 XML 架构,您可以使用随 Windows 软件开发工具包 (SDK) 提供的 XSD.exe 工具生成强类型数据集。 More info on strongly typed Dataset
这将允许您使用 Deserialize 方法使用强类型数据集。
请记住,您必须在 XML 模式中模仿您的 JSON 结构。 为了在最后有一些与你的 JSON 结构兼容的东西。
【讨论】:
【参考方案2】:作为一个动态 C# 解决方案(当您不知道要反序列化的对象结构时),通过使用@Dhaval 的答案并在使Deserialize<>()
方法无效后,我使用以下方法来做到这一点:
更新:DataSet.ReadXml
在将 XML 节点读取为 XmlReadMode
时有一些选项:
private static DataSet ReadDataFromJson(string jsonString, XmlReadMode mode = XmlReadMode.Auto)
//// Note:Json convertor needs a json with one node as root
jsonString = $" \"rootNode\": jsonString.Trim().TrimStart('').TrimEnd('') ";
//// Now it is secure that we have always a Json with one node as root
var xd = JsonConvert.DeserializeXmlNode(jsonString);
//// DataSet is able to read from XML and return a proper DataSet
var result = new DataSet();
result.ReadXml(new XmlNodeReader(xd), mode);
return result;
例如如果您想从数据中推断出强类型架构:
var dataset = ReadDataFromJson(yourString, XmlReadMode.InferTypedSchema);
【讨论】:
问题在于 xml 格式不会保留 int、bool 等。如果您使用此方法并将其转换回 json 字符串,那么您的所有布尔值现在都将为“false”(使用引号)而不是只是假(不带引号),你的整数将是“1”而不是1。 @nickvans 我更新了我的答案以支持可以推断类型的 XML 读取选项 -HTH ;)。【参考方案3】:Private Function convertJsonStringToDataSet(jsonString As String) As DataSet
Dim xd As New XmlDocument()
jsonString = " ""rootNode"": " + jsonString.Trim().TrimStart(""c).TrimEnd(""c) + " "
xd = DirectCast(Newtonsoft.Json.JsonConvert.DeserializeXmlNode(jsonString), XmlDocument
Dim ds As New DataSet()
ds.ReadXml(New XmlNodeReader(xd))
Return ds
End Function
【讨论】:
【参考方案4】:我更喜欢你听从 Nick 的建议……也许你的 Web 服务应该修改,因为我在每个 Table 和 Table1 上看到了类似的属性以及里面的属性……
使用 json2csharp.com 创建类,我得到了这个
public class Table
public string DisplayVoucherNumber get; set;
public string ActualDate get; set;
public string AccountName get; set;
public string NetWeight get; set;
public string Weight get; set;
public string Pcs get; set;
public string Difference get; set;
使用List<Table> list = JsonConvert.DeserializeObject<List<Table>>(jsonstring);
【讨论】:
【参考方案5】:为您的反序列化数据创建一个类。
使用:
YourClass yourObject = JsonConvert.DeserializeObject<YourClass>(jsonStr);
【讨论】:
【参考方案6】:试试这个,
string json = @"
'Table1': [
'id': 0,
'item': 'item 0'
,
'id': 1,
'item': 'item 1'
]
";
DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(json);
DataTable dataTable = dataSet.Tables["Table1"];
序列化 json : Link
【讨论】:
以上是关于如何将 JSONString 解析为数据集?的主要内容,如果未能解决你的问题,请参考以下文章
如何将查询的结果集转换为可以进一步解析以创建json的pojo类?
Spark SQL - 转换为数据集列的 UUID 引发解析异常