【问题标题】:Newtonsoft.Json JsonConvert To DatatableNewtonsoft.Json Json转换为数据表
【发布时间】:2014-09-11 08:32:54
【问题描述】:

我有这样的代码,

DataTable dt = new DataTable();

string data = "{\"ProductId\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77],\"ProductName\":[\"Chai\",\"Chang\",\"Aniseed Syrup\",\"Chef Anton's Cajun Seasoning\",\"Chef Anton's Gumbo Mix\",\"Grandma's Boysenberry Spread\",\"Uncle Bob's Organic Dried Pears\",\"Northwoods Cranberry Sauce\",\"Mishi Kobe Niku\",\"Ikura\",\"Queso Cabrales\",\"Queso Manchego La Pastora\",\"Konbu\",\"Tofu\",\"Genen Shouyu\",\"Pavlova\",\"Alice Mutton\",\"Carnarvon Tigers\",\"Teatime Chocolate Biscuits\",\"Sir Rodney's Marmalade\",\"Sir Rodney's Scones\",\"Gustaf's Knäckebröd\",\"Tunnbröd\",\"Guaraná Fantástica\",\"NuNuCa Nuß-Nougat-Creme\",\"Gumbär Gummibärchen\",\"Schoggi Schokolade\",\"Rössle Sauerkraut\",\"Thüringer Rostbratwurst\",\"Nord-Ost Matjeshering\",\"Gorgonzola Telino\",\"Mascarpone Fabioli\",\"Geitost\",\"Sasquatch Ale\",\"Steeleye Stout\",\"Inlagd Sill\",\"Gravad lax\",\"Côte de Blaye\",\"Chartreuse verte\",\"Boston Crab Meat\",\"Jack's New England Clam Chowder\",\"Singaporean Hokkien Fried Mee\",\"Ipoh Coffee\",\"Gula Malacca\",\"Rogede sild\",\"Spegesild\",\"Zaanse koeken\",\"Chocolade\",\"Maxilaku\",\"Valkoinen suklaa\",\"Manjimup Dried Apples\",\"Filo Mix\",\"Perth Pasties\",\"Tourtière\",\"Pâté chinois\",\"Gnocchi di nonna Alice\",\"Ravioli Angelo\",\"Escargots de Bourgogne\",\"Raclette Courdavault\",\"Camembert Pierrot\",\"Sirop d'érable\",\"Tarte au sucre\",\"Vegie-spread\",\"Wimmers gute Semmelknödel\",\"Louisiana Fiery Hot Pepper Sauce\",\"Louisiana Hot Spiced Okra\",\"Laughing Lumberjack Lager\",\"Scottish Longbreads\",\"Gudbrandsdalsost\",\"Outback Lager\",\"Flotemysost\",\"Mozzarella di Giovanni\",\"Röd Kaviar\",\"Longlife Tofu\",\"Rhönbräu Klosterbier\",\"Lakkalikööri\",\"Original Frankfurter grüne Soße\"]}";

dt = JsonConvert.DeserializeObject<DataTable>(data);

如果我在在线 json 编辑器上将这些数据作为删除 \ char 运行,它就会显示出来。但是在Visual Studio中,出现了错误,

Unexpected JSON token when reading DataTable. Expected StartArray, got StartObject. Path '', line 1, position 1.

在最后一个代码位置。

我想使用 Newtonsoft 插件将数据转换为 DataTable。我怎么解决这个问题?谢谢。

【问题讨论】:

  • 试试this。将 json 字符串作为数组的技巧。

标签: c# json json.net


【解决方案1】:

您的 json 必须是要转换为 DataTable 的对象数组,它必须像这样开始:

"[{\"ProductId\..........

这样结束:

....,\"fieldName\":Value}]"

【讨论】:

    【解决方案2】:

    您的data 无法转换为Datatabe

    当我尝试你的代码时,它给了我:

    完成反序列化后在 JSON 字符串中发现的附加文本 对象。

    但是当我这样做时:

    object obj  = JsonConvert.DeserializeObject(data); 
    

    工作正常。

    您也可以创建自己的类:

    public class MyObject
    {
        public int[] productId { get; set; }
        public string[] ProductName { get; set; }
    }
    
    MyObject obj = JsonConvert.DeserializeObject<MyObject>(data); 
    

    所以对于你拥有的不同类型的数据,你可以创建不同的类:

        public class MyObject2{
        ...
        }
    
        public class MyObject3{
        ...
        }
        ...
    
    Object obj = null;
    try{
     obj = JsonConvert.DeserializeObject<MyObject>(data); 
    }catch{
          try{
          obj = JsonConvert.DeserializeObject<MyObject2>(data);
          }catch{
               try{
                 obj = JsonConvert.DeserializeObject<MyObject3>(data);
               }catch{
                 //Log error new type of data received
                 throw new Exception();
               }
          }
    
    }
    if (obj.GetType() == typeof(MyObject)){
       ...
    }else if (obj.GetType() == typeof(MyObject2)){
       ...
    }
    ....
    

    【讨论】:

    • 你写 MyObject 类。但收入数据,多变,不稳定。在这种情况下我该怎么办?
    • 可能你有一些不同的数据格式,为它们每个创建类并在try catch块中做
    • 如果你有时间,你能回答一下吗?
    • 我不明白你在问什么
    • 对不起,如果你有时间,你能想出你说的代码吗?因为我要工作到 2 天,所以我无法解决这个问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2012-08-12
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    相关资源
    最近更新 更多