【问题标题】:Unexpected JSON token when reading DataTable读取 DataTable 时出现意外的 JSON 令牌
【发布时间】:2018-09-18 07:47:31
【问题描述】:

我有以下 json 字符串:

{
    "Orders": [{
        "SubOrderNo": "0582715",
        "ItemNo": "20415541",
        "ItemType": "ART",
        "ItemName": "Fish",
        "TemplateName": "TP1234",
        "ObjectType": "MPP",
        "ObjectId": "PE1234",
        "SalesStartDate": "2018-08-01",
        "InfoText": "Some dummy text. This till be replaced later with some awesome text instead. Happy Fish!",
        "Attachment": null,
        "TemplateImage": null,
        "ApprovedBy": "Me",
        "ExpectedDeliveryDate": "2017-10-20",
        "Context": null,
        "TemplateDescription": null,
        "ColorStatus": 0,
        "spArticles": []
    }],
    "JsonOrders": null
}

我已经在 json lint 上验证了这个,所以它是有效的 json。

我有以下代码:

 public static DataTable jsonStringToTable(string jsonContent)
    {
        DataTable dt = JsonConvert.DeserializeObject<DataTable>(jsonContent);
        return dt;
    }

当我运行它时,我得到了错误:

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

谁能告诉我为什么我不能将我的 json 转换为数据表?

【问题讨论】:

    标签: c# json datatable


    【解决方案1】:

    使用这个,我希望它会工作。

    //需要.net Framework 4.5 以上。

    public static DataTable Tabulate(string jsonContent)
        {
            var jsonLinq = JObject.Parse(jsonContent);
    
            // Find the first array using Linq
            var srcArray = jsonLinq.Descendants().Where(d => d is JArray).First();
            var trgArray = new JArray();
            foreach (JObject row in srcArray.Children<JObject>())
            {
                var cleanRow = new JObject();
                foreach (JProperty column in row.Properties())
                {
                    // Only include JValue types
                    if (column.Value is JValue)
                    {
                        cleanRow.Add(column.Name, column.Value);
                    }
                }
    
                trgArray.Add(cleanRow);
            }
    
            return JsonConvert.DeserializeObject<DataTable>(trgArray.ToString());
        }
    

    【讨论】:

      【解决方案2】:

      如果您不想映射您的对象,您可以尝试这种方式:

      string json = File.ReadAllText("bryan.json");
      dynamic result = JsonConvert.DeserializeObject(json);
      Console.WriteLine(result.Orders[0].ObjectId);
      

      这将创建一个不提供类的对象,它将以与您的 js 对象完全相同的方式动态分配属性

      【讨论】:

      【解决方案3】:

      您需要先将您的json字符串反序列化为对象,然后使用该对象转换为数据表

      public static DataTable jsonStringToTable(string jsonContent)
      {
        dynamic jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonContent);
        DataTable dt = JsonConvert.DeserializeObject<DataTable>(Convert.ToString(jsonObject.Orders));
        return dt;
       }
      

      【讨论】:

      • 什么?我已经将我的对象反序列化为 jsonstring?为什么要再做一次?但是,当我运行您的代码时出现以下错误:解析值时遇到意外字符:S. Path '', line 0, position 0.
      • 您需要将 jsonObject 作为动态而不是 var。更新了我的答案。
      • 您的json字符串中有Orders作为对象键,不能直接反序列化为数据表,您需要访问其内部json字符串。
      猜你喜欢
      • 2021-02-09
      • 1970-01-01
      • 2016-01-28
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-18
      相关资源
      最近更新 更多