Десериализовать данные формы в кодировке Razor (в формате JSON) для - PullRequest
0 голосов
/ 12 октября 2018

Я хотел бы десериализовать следующую строку json, представляющую данные формы для объекта.Исходный объект содержал элементы List (которые были отрисованы с использованием Razor)

{  
   "Office":"10649273-8412-4ac0-9109-085b04b49964",
   "SearchItemList[0].Column":"Account",
   "SearchItemList[0].Operation":"0",
   "SearchItemList[0].Value":"be5a36a7-c301-44d7-8d40-85e9637b5b14",
   "SearchItemList[1].Column":"",
   "SearchItemList[1].Operation":"0",
   "SearchItemList[1].Value":"",
   "SearchItemList[2].Column":"",
   "SearchItemList[2].Operation":"0",
   "SearchItemList[2].Value":"",
   "SearchItemList[3].Column":"",
   "SearchItemList[3].Operation":"0",
   "SearchItemList[3].Value":"",
   "SearchItemList[4].Column":"",
   "SearchItemList[4].Operation":"0",
   "SearchItemList[4].Value":"",
   "SearchItemList[5].Column":"",
   "SearchItemList[5].Operation":"0",
   "SearchItemList[5].Value":""
}

1 Ответ

0 голосов
/ 13 октября 2018

В вашем вопросе не указано, в какой объект вы хотите десериализоваться.Если вам все равно, быстрый и грязный способ - десериализовать этот JSON в Dictionary<string, string>.Затем вы можете выбрать любые ключи, которые вам нужны, - они будут такими же, как в JSON.Например (я использую Json.Net здесь):

var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
Console.WriteLine(dict["SearchItemList[0].Column"] + ": " + dict["SearchItemList[0].Value"]);

Это выдаст:

Account: be5a36a7-c301-44d7-8d40-85e9637b5b14

Однако я подозреваю, что вы действительно ищетеfor - вернуть данные в некую структуру классов, напоминающую «оригинальный объект», который, как я предполагаю, выглядит примерно так:

class RootObject
{
    public string Office { get; set; }
    public List<SearchItem> SearchItemList { get; set; }
}

class SearchItem
{
    public string Column { get; set; }
    public string Operation { get; set; }
    public string Value { get; set; }
}

Для этого вы можете десериализовать JSON в JObject, затем преобразуйте его оттуда в желаемый результат, используя стандартные System.Linq методы:

JObject obj = JObject.Parse(json);
RootObject root = new RootObject
{
    Office = (string)obj["Office"],
    SearchItemList = 
        obj.Properties()
           .Where(p => p.Name.StartsWith("SearchItemList["))
           .Select(p =>
           {
               var parts = p.Name.Split(new string[] { "[", "]." }, 3, StringSplitOptions.None);
               return new
               {
                   Index = int.Parse(parts[1]),
                   Property = new JProperty(parts[2], p.Value)
               };
           })
           .GroupBy(a => a.Index)
           .OrderBy(g => g.Key)
           .Select(g => new JObject(g.Select(a => a.Property)).ToObject<SearchItem>())
           .ToList()
};

Fiddle: https://dotnetfiddle.net/nQ2D2F

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