如何解析JSONString到数据集?

时间:2013-10-02 11:38:46

标签: c# json type-conversion

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

6 个答案:

答案 0 :(得分:12)

作为动态 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;
}

E.g。如果要从数据中推断强类型模式:

var dataset = ReadDataFromJson(yourString, XmlReadMode.InferTypedSchema);

答案 1 :(得分:8)

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

这样的东西
DataSet myDataSet= JsonConvert.DeserializeObject<DataSet>(jsonstring)

您继续使用数据集进行编码。比如访问数据集中的数据表。

如果这是您想要实现的目标,并且不希望使用您之前的答案所建议的POCO。 您可能需要在

之前创建一个Typed DataSet
  

如果XML Schema符合XML Schema定义语言(XSD)标准,则可以使用随Windows软件开发工具包(SDK)提供的XSD.exe工具生成强类型DataSet。   More info on strongly typed Dataset

这将允许您使用Deserialize方法使用强类型数据集。

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

答案 2 :(得分: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

答案 3 :(得分:0)

我更喜欢你遵循Nick的建议......也许你的网络服务应该被修改,因为我在每个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. 您可以访问该列表对象以放置您的DataSet。

答案 4 :(得分:0)

  1. 为反序列化数据创建

  2. 使用

    YourClass yourObject = JsonConvert.DeserializeObject<YourClass>(jsonStr);
    

答案 5 :(得分: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:Link