Данные jObject.Parse и JsonConvert.DeserializeObject в DataTable приводят к исключению несоответствия счетчика параметров - PullRequest
0 голосов
/ 24 июня 2019

У меня проблема со следующим (тестовым) кодом.Это дает мне ошибку «Несоответствие количества параметров» в строке

dataTable.Merge(CreateDataTableFromObject(info.GetValue(inputObject)));

Весь код выглядит так:

public object SerializeThis(DataTable dataTable1, DataTable dataTable2)
        {
        string jsonString = @"{'EquipmentNumber':'CP5301078','Data_General_Exp': {'Authgrp':'CP01','Objecttype':'9A1B'}}";

            var jConvertObejct = (JsonConvertObject)JsonConvert.DeserializeObject(jsonString, typeof(JsonConvertObject));
            var jObject = JObject.Parse(jsonString);

            dataTable1 = CreateDataTableFromObject(jConvertObejct);
            dataTable2 = CreateDataTableFromObject(jObject);

            return jConvertObejct;
        }

public DataTable CreateDataTableFromObject(object inputObject)
        {
            DataTable dataTable = new DataTable();
                Type type = inputObject.GetType();
                var properties = type.GetProperties();
                PropertyInfo info;

                for (int i = 0; i < properties.Length; i++)
                {
                    info = properties[i];
                    if (info.GetValue(inputObject).GetType().GetProperties().Count() > 2)
                        dataTable.Merge(CreateDataTableFromObject(info.GetValue(inputObject)));
                    else
                        if (!dataTable.Columns.Contains(info.Name))
                        dataTable.Columns.Add(new DataColumn(info.Name, Nullable.GetUnderlyingType(info.PropertyType) ?? info.PropertyType));
                }
            return dataTable;
        }

Обратите внимание, что я пытаюсь сделать то же самое с обоимиобъект JsonConvert и JObject - ошибка возникает при выполнении

CreateDataTableFromObject(object inputObject) 

на объекте JObject, а не на объекте JsonConvert.

Мне нужно решение для JObject, как у меняобрабатывать некоторые неизвестные строки json, которые мне нужно вставить в DataTable (имена столбцов - это имена свойств, а значения строк - значения объектов json).Я опустил употребления.Я не вижу, чтобы на это отвечали какие-либо другие статьи stackoverflow.

1 Ответ

0 голосов
/ 26 июня 2019

ОК - я обнаружил, что все немного запутал.И пришел к такому решению:

        public static DataTable DeSerializeThis(string jsString)
        {
            const string json1 = @"{""EquipmentNumber"":""CP1"",""Authgrp"":""CP01"",""Objecttype"":""9A1A""}";
            const string json2 = @"{""EquipmentNumber"":""CP2"",""Authgrp"":""CP02"",""Objecttype"":""9B1B""}";
            List<JObject> list = new List<JObject>();
            list.Add(JObject.Parse(json1));
            list.Add(JObject.Parse(json2));
            DataTable table = ToDataTable(list);
            return table;
        }
        static public DataTable ToDataTable(List<JObject> list)
        {
            DataTable dataTable = new DataTable();
            int i = 0;
            foreach (JToken content in list.ToList<JToken>())
            {
                dataTable.Rows.Add();
                foreach (JProperty prop in content)
                {
                    if (i == 0)
                    {
                        dataTable.Columns.Add(prop.Name);
                    }
                    dataTable.Rows[i][prop.Name] = prop.Value;
                }
                i++;
            }
            return dataTable;
        }

Только теперь возникает вопрос, можно ли это переписать так, чтобы

ToDataTable(List<JObject> list)

могло иметь

List<T> 

вместо этого - я не нашел ответа на этот вопрос ...

...