Как сделать JSON из DataTable с переменными в качестве ключа - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть запрос из базы данных с множеством строк, хранящихся в DataTable.

У меня 40 идентификаторов, но у каждого идентификатора 300 строк.Данные выглядят так:

DataTable data

Я хочу сериализовать это из DataTable как JSON с ID и F_SD в качестве ключа.

После сериализации DataTable я получаю JSON, который выглядит следующим образом:

undesirable JSON

Может кто-нибудь помочь мне с этим?Я буду использовать эти данные во внешнем интерфейсе для графика js.Я хочу что-то вроде:

{
    "ID": {
        "f_sd1": {
            "value": 1.555
        }
        "f_sd2": {
            "value": xxxx
        }
    }
    "nextID": {
        "f_sd1": {
            "value": 1.555
        }
        "f_sd2": {
            "value": xxxx
        }
    }
}

Я сериализирую это прямо сейчас:

using (con = new OracleConnection(constr))
{
    using (cmd = new OracleCommand(query, con))
    {
        con.Open();

        OracleDataAdapter sda = new OracleDataAdapter(cmd);
        sda.Fill(dt1);                    
        var list = JsonConvert.SerializeObject(dt1, Formatting.None, new JsonSerializerSettings() {
            ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
        });

        return Content(list, "application/json");                    
    }
}

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

Вы можете использовать методы Linq, чтобы сгруппировать строки вашего DataTable в анонимную структуру объекта и затем сериализовать это:

    var obj = dt1.Rows
        .Cast<DataRow>()
        .GroupBy(row => (int)row["ID"])
        .ToDictionary(g => g.Key,
                      g => g.ToDictionary(row => (int)row["F_SD"],
                                          row => new { value = (decimal)row["VAL"] }));

    string json = JsonConvert.SerializeObject(obj, Formatting.Indented);

    return Content(json, "application/json");

Fiddle: https://dotnetfiddle.net/zWIUZ5

0 голосов
/ 27 ноября 2018

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

 public class DataModel
        {
            public string ID { get; set; }
            public List<string> fid{ get; set; }
            public string Value { get; set; }      
        }

Затем сериализуйте свой объект, используя NewtonSoft Json

Newtonsoft.Json.JsonConvert.SerializeObject(DataMOdel))
0 голосов
/ 27 ноября 2018

попробуй:

using Newtonsoft.Json.JsonWriter

 using (JsonWriter writer = new JsonTextWriter(sw))
 {
     for(int i = 0; i < table.Rows.Count; )
     {
        writer.WritePropertyName(table.Rows[i]["ID"]);
        writer.WriteStartObject();
        DataRow[] idsMatch = table.Select("ID = "+table.Rows[i]["ID"])+"");]

        foreach(DataRow row in idsMatch)
        {
          writer.WritePropertyName("f_sd"+row["F_SD"]);
          writer.WriteStartObject();
          writer.WritePropertyName("value");
          writer.WriteValue(row["VAL"]);
          writer.WriteEndObject();
          i++;
        }

        writer.WriteEndObject();
     }
   }
0 голосов
/ 27 ноября 2018

1- Создайте объект словаря из таблицы данных.2- Добавьте пакет newtonsoft с помощью nuget с помощью 'Install-Package Newtonsoft.Json'. 3- Затем используйте метод JsonConvert.SerializeObject, например:

JsonConvert.SerializeObject(dictionaryObject);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...