6

我正在使用 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"
        }
    ]
}
4

6 回答 6

15

你的问题不是很清楚。我想您想要做的是取回一个可以在反序列化后映射到您的数据集的对象。就像是

DataSet myDataSet= JsonConvert.DeserializeObject<DataSet>(jsonstring)

你继续用你的数据集进行编码。就像访问数据集中的数据表一样。

如果这是您想要实现的目标,并且不想按照先前答案的建议使用您自己的 POCO。您可能需要先创建一个 Typed DataSet

给定一个符合 XML 架构定义语言 (XSD) 标准的 XML 架构,您可以使用随 Windows 软件开发工具包 (SDK) 提供的 XSD.exe 工具生成强类型数据集。 有关强类型数据集的更多信息

这将允许您使用反序列化方法使用强类型数据集。

请记住,您必须在 XML 模式中模仿您的 JSON 结构。为了在最后有一些与你的 JSON 结构兼容的东西。

于 2013-10-02T14:31:11.470 回答
13

作为动态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);
于 2015-12-15T11:25:26.303 回答
1
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
于 2015-03-27T05:45:40.667 回答
0

我更喜欢你遵循尼克的建议......也许你的网络服务应该修改,因为我在每个 Table 和 Table1 上看到了类似的属性以及里面的属性......

  1. 使用 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; }
    }
    
  2. 使用反序列化 json 字符串
    List<Table> list = JsonConvert.DeserializeObject<List<Table>>(jsonstring);

  3. 您可以访问该列表对象以放入您的数据集。
于 2013-10-02T14:03:06.130 回答
0
  1. 为您的反序列化数据创建一个

  2. 使用

    YourClass yourObject = JsonConvert.DeserializeObject<YourClass>(jsonStr);
    
于 2013-10-02T14:06:16.970 回答
0

尝试这个,

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 :链接

于 2019-08-14T07:34:55.743 回答