Вложенный JSON из datatable и IList - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть две переменные

Datatable listOfObject

, которые производят JSON, как показано ниже

"listofObject" : [
{
   "Obj1": "Some String Value",
   "Obj2": "Some Date Value",
   "Obj3": "Some Int Value",
   "Obj4": "Some Date Value",
....
}
] 

, и другой объект

IList<Class> ObjectInfo

, который производит JSON, как показано ниже

"ObjectInfo" : [
  {
     "name" : "Obj1",
     "Style" : "Style Name",
     "Data Type" : "String"
  },
  {
     "name" : "Obj2",
     "Style" : "Style Name",
     "Data Type" : "Date"
  },
  {
     "name" : "Obj3",
     "Style" : "Style Name",
     "Data Type" : "Int"
  },
.....
]

как их объединить, чтобы получить структуру JSON Как показано ниже

"finalStructure" :[
  "Obj1": {
         "Style" : "Style Name",
         "Data Type" : "String"
          },
  "Obj2": {
         "Style" : "Style Name",
         "Data Type" : "Date"
          },
  "Obj3": {
         "Style" : "Style Name",
         "Data Type" : "Int"
          },
....
]

1 Ответ

0 голосов
/ 11 декабря 2018

Из таблицы данных у вас есть IEnumerable<IDictionary<string, string>>, поэтому вам нужно сначала создать поиск, а затем безопасно проецировать свои результаты:

var items = listOfObjects.FromJson<IEnumerable<IDictionary<string, string>>>();

var info = objectInfo.FromJson<IEnumerable<IDictionary<string, string>>>()
    .ToLookup(it => it.Single(k => k.Key == "name").Value, it => it.Where(k => k.Key != "name"));

var restructured = items
    .SelectMany(it => it.Keys)
    .GroupBy(it => it)
    .Select(it => new
    {
        Key = it.Key,
        Value = info[it.Key].SelectMany(fo => fo).ToDictionary(fo => fo.Key, fo => fo.Value)
    })
    .ToDictionary(it => it.Key, it => it.Value);

// extension method with NewtonSoft.JSON.net
public static T FromJson<T>(this string json)
{
    var serializer = new JsonSerializer();
    using (var sr = new StringReader(json))
    using (var jr = new JsonTextReader(sr))
    {
        var result = serializer.Deserialize<T>(jr);
        return result;
    }
}
...