Samira Radwan Ответов: 1

JSON-файл в datatable(ы)


Привет Эксперты,

Я знаю, что это может быть задано много раз раньше, и у меня есть много решений, но ни одно из них не работает для меня. У меня есть JSON-файл, который нужно преобразовать в datatable(s).
Я пытался использовать JsonConvert.DeserializeObject & lt;class> (JSONFILE)
Также пробовать JsonConvert.DeserializeAnonymousType
и попытался преобразовать в объект / массив
все вышеперечисленные методы возвращают ошибки. Пожалуйста, смотрите ниже файл JSON и код, который я пробовал.

Заранее спасибо!!
Самира

Что я уже пробовал:

JSON-файл
{
  "vehicle-make": {
    "id": "kia",
    "name": "Kia",
    "path": "p"
  },
  "vehicle-year": {
    "id": "2016-std-key",
    "name": "2016 Std. Key",
    "path": "p1"
  },
  "vehicle-model": {
    "id": "rio",
    "name": "Rio",
    "path": "p2"
  },
  "product": {
    "id": "orbit000a",
    "name": "ORBIT000A",
    "path": "/v1/catalog/orbit000a",
    "description": "description",
    "category": "kit"
  },
  "coverage": {
    "t-harness-support": false,
    "\"track-pack\"-gauges": false,
    "2-way-serial-data-communication": false,
    "3xlock-start-from-oem-remote": false,
    "3xlock-start-w-aftermarket-starter": false    
  },
  "accessories": []
}

Различные способы преобразования JSON в DT
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
            httpWebRequest.Headers.Add(headerKey, headerVal);
            httpWebRequest.Method = WebRequestMethods.Http.Get;
            httpWebRequest.Accept = "application/json; charset=utf-8";
            string JSONfile;
            var response = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var sr = new StreamReader(response.GetResponseStream()))
            { JSONfile = sr.ReadToEnd(); }
            JSONfile = JSONfile.Replace("vehicle-make", "vehiclemake"); 
            JSONfile = JSONfile.Replace("vehicle-year", "vehicleyear");
            JSONfile = JSONfile.Replace("vehicle-model", "vehiclemodel");

            //****method(1)**** error unexpected end of data
            var obj = JObject.Parse(JSONfile);
            var array = new JArray(obj["vehiclemake"].Values());
            var dt = array.ToObject<DataTable>();
         //**** method(2) return null object
         clsMakes make = JsonConvert.DeserializeObject<clsMakes>(JSONfile);
        //also tried with list 
//Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[ApiConnect.clsMakes]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly
       var make = JsonConvert.DeserializeObject<List<clsMakes>>(JSONfile);
      //class clsMakes
    class clsMakes
    {
        
        public string id {get;set;}
        public string name { get; set; }
        public string path { get; set; }
    }
//method(3)
//Unexpected JSON token when reading DataTable. Expected StartArray, got StartObject. Path 'vehiclemake'
var makeTB = JsonConvert.DeserializeAnonymousType(JSONfile, new { vehiclemake = default(DataTable) }).vehiclemake;

j snooze

Вы пытаетесь получить только марку автомобиля из этого, или вам нужен каждый отдельный объект(год автомобиля, модель, продукт и т. д.)?

Samira Radwan

Я недд весь объект, используя марку автомобиля в качестве примера

1 Ответов

Рейтинг:
5

Graeme_Grant

Проблема, с которой вы сталкиваетесь, заключается в том, что у вас есть сложные имена узлов, которые непосредственно не переводятся .Чистые имена переменных. Таким образом, динамическое создание объектов терпит неудачу.

Примерами этого являются:

vehicle-model
\"track-pack\"-gauges
3xlock-start-from-oem-remote
Все они являются недопустимыми именами .Net-имен, но допустимыми именами узлов Json.

Это не значит, что это невозможно сделать, это значит, что вы должны сделать это вручную.
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;

namespace JsonConverter2
{
    class Program
    {
        static void Main(string[] args)
        {
            string raw = File.ReadAllText("data.json");
            var data = JsonHelper.ToClass<Response>(raw);
            Debugger.Break();
        }
    }

    public class VehicleMake
    {

        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("path")]
        public string Path { get; set; }
    }

    public class VehicleYear
    {

        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("path")]
        public string Path { get; set; }
    }

    public class VehicleModel
    {

        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("path")]
        public string Path { get; set; }
    }

    public class Product
    {

        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("path")]
        public string Path { get; set; }

        [JsonProperty("description")]
        public string Description { get; set; }

        [JsonProperty("category")]
        public string Category { get; set; }
    }

    public class Coverage
    {

        [JsonProperty("t-harness-support")]
        public bool THarnessSupport { get; set; }

        [JsonProperty("\"track-pack\"-gauges")]
        public bool TrackPackGauges { get; set; }

        [JsonProperty("2-way-serial-data-communication")]
        public bool AA2WaySerialDataCommunication { get; set; }

        [JsonProperty("3xlock-start-from-oem-remote")]
        public bool AA3xlockStartFromOemRemote { get; set; }

        [JsonProperty("3xlock-start-w-aftermarket-starter")]
        public bool AA3xlockStartWAftermarketStarter { get; set; }
    }

    public class Response
    {

        [JsonProperty("vehicle-make")]
        public VehicleMake VehicleMake { get; set; }

        [JsonProperty("vehicle-year")]
        public VehicleYear VehicleYear { get; set; }

        [JsonProperty("vehicle-model")]
        public VehicleModel VehicleModel { get; set; }

        [JsonProperty("product")]
        public Product Product { get; set; }

        [JsonProperty("coverage")]
        public Coverage Coverage { get; set; }

        [JsonProperty("accessories")]
        public IList<object> Accessories { get; set; }
    }

    public static class JsonHelper
    {
        public static T ToClass<T>(string data, JsonSerializerSettings jsonSettings = null)
        {
            var response = default(T);

            if (!string.IsNullOrEmpty(data))
                response = jsonSettings == null
                    ? JsonConvert.DeserializeObject<T>(data)
                    : JsonConvert.DeserializeObject<T>(data, jsonSettings);

            return response;
        }
    }
}


Samira Radwan

Спасибо за ответ, я следовал вашему коду и создал все классы, и в [Main] это мой полный код:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Создать (url);
класс HttpWebRequest.Заголовки.Добавить (headerKey, headerVal);
класс HttpWebRequest.Способ = WebRequestMethods.Протоколу HTTP.Вам;
класс HttpWebRequest.Accept = " application/json; charset=utf-8";
строки JSONfile;
var response = (HttpWebResponse)httpWebRequest. GetResponse();
using (var sr = new StreamReader (response.GetResponseStream()))
{ JSONfile = sr. ReadToEnd(); }
var data = JsonHelper.ToClass & lt;response> (JSONfile);
Отладчик.Ломать();

нет ошибок, но (данные) равны нулю, я имею в виду, что все объекты равны нулю (марки/модели....), я что-то упускаю? Спасибо!

Graeme_Grant

Приведенный выше код был проверен и работал нормально.

Вы установили точку останова и проверили, если JSONfile есть какие-нибудь данные?

Samira Radwan

Кроме того, если я хочу создать DT из каждого объекта отдельно, как это сделать? Еще раз спасибо!!

Graeme_Grant

На этот открытый вопрос трудно ответить. Структура не плоская.

Вам придется определить, что и как. Это выходит за рамки данного вопроса и потребует нового вопроса, как только вы его рассмотрите и дадите ему ход. Проблема здесь заключалась в декодировании данных Json, и это было описано в приведенном выше решении.

Samira Radwan

Вообще-то ты прав.
Я постараюсь извлечь все необходимые мне данные из созданных объектов
Еще раз спасибо, сэкономили мне уйму времени!!