Неожиданный токен JSON при чтении таблицы данных - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть следующая строка 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 в Dataatable?

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Используйте это, я надеюсь, это сработает.

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());
    }
0 голосов
/ 18 сентября 2018

Поскольку ваш объект является сложной моделью из ваших данных JSON. Вы не можете использовать DataTable нести его.

Так что я бы написал класс моделей для его переноса.

public class Order
{
    public string SubOrderNo { get; set; }
    public string ItemNo { get; set; }
    public string ItemType { get; set; }
    public string ItemName { get; set; }
    public string TemplateName { get; set; }
    public string ObjectType { get; set; }
    public string ObjectId { get; set; }
    public string SalesStartDate { get; set; }
    public string InfoText { get; set; }
    public object Attachment { get; set; }
    public object TemplateImage { get; set; }
    public string ApprovedBy { get; set; }
    public string ExpectedDeliveryDate { get; set; }
    public object Context { get; set; }
    public object TemplateDescription { get; set; }
    public int ColorStatus { get; set; }
    public List<object> spArticles { get; set; }
}

public class RootObject
{
    public List<Order> Orders { get; set; }
    public object JsonOrders { get; set; }
}

Получить модель будет как.

var result= JsonConvert.DeserializeObject<RootObject>(jsonContent);

Если вы хотите разрешить JSON DataTable, вы можете прочитать ключ JSON = Order

но с "spArticles": [] будет ошибка, если вы хотите DeserializeObject для DataTable

[{
    "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": []  //<--- There will excute a error, I report for Json.net will be fixed in future.  
}]

https://github.com/JamesNK/Newtonsoft.Json/issues/1763


Поэтому я бы предложил вам использовать модели для переноса данных JSON вместо DataTable

0 голосов
/ 18 сентября 2018

Если вы не хотите отображать свой объект, вы можете попробовать это следующим образом:

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

Это создаст объект без указания класса, который будет динамически распределять свойства точно так же, какваш объект js

0 голосов
/ 18 сентября 2018

Вам необходимо сначала десериализовать строку 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;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...