如何将 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&lt;&gt;() 方法无效后,我使用以下方法来做到这一点:

更新: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&lt;Table&gt; list = JsonConvert.DeserializeObject&lt;List&lt;Table&gt;&gt;(jsonstring);

    反序列化json字符串 您可以访问该列表对象以放入您的数据集。

【讨论】:

【参考方案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 解析为数据集?的主要内容,如果未能解决你的问题,请参考以下文章

Photoshop 变量 - 无法将文件内容解析为数据集。

使用 SQL Server 将字符串数据块解析为表格数据集

如何将查询的结果集转换为可以进一步解析以创建json的pojo类?

Spark SQL - 转换为数据集列的 UUID 引发解析异常

在 Azure 数据工厂中使用复制数据活动将 xml 解析为 json 时如何删除转义字符?

如何将数据集划分为训练集和测试集?