8
var tree = {
   left: {
       left: "Первое предложение из произвольной строки",
       right: {
           left: "Другое произвольное предложение",
           right: "Еще одно следующее предложение, но не очень длинное"
       }
   },
   right: {
       left: {
           left: {
               left: "Еще одно не очень длинное предложение",
               right: ""
           }, 
           right: {
               left: "",
               right: "Еще одно не очень длинное предложение"
           }
       },
       right: {
           left: {
               left: "Предложение",
               right: "Еще одно следующее предложение, но не очень длинное"
           },
           right: {
               left: "Другое произвольное предложение",
               right: {
                   left: "Два слова",
                   right: "Еще одно следующее предложение, но не очень длинное"
               }
           }
       }
   }
}
combo
  • 105
  • 1
    http://json2csharp.com/ – tym32167 Oct 27 '17 at 20:37
  • Но сам компилятор C# не воспринимает данный формат как валидный JSON, а json2csharp.com спокойно преобразовывает его в объект. Какие манипуляции необходимо первоначально сделать чтобы я смогла обратиться к любому right/left – combo Oct 27 '17 at 21:29
  • Компилятор C# не занимается парсингом или валидацией json. Вам надо сгенерировать классы и десериализовать в них ваш JSON, чтобы создать экземпляры классов, заполненные вашими данными – tym32167 Oct 27 '17 at 21:33
  • @tym32167: https://i.stack.imgur.com/4hRvX.png – VladD Dec 15 '17 at 12:28
  • @VladD я в курсе этого, спасибо. Сам не использую студию для мелких задач, потому использую тот сервис чаще - а что чаще использую, то и рекомендую :) – tym32167 Dec 15 '17 at 12:31
  • @tym32167: Возможно, стоит дописать пару слов в ответе для будущих читателей? А то сервис может быть закрыт или упасть, а VS у .NET-разработчика должна найтись где-нибудь. – VladD Dec 15 '17 at 12:32
  • @VladD готово, добавил – tym32167 Dec 15 '17 at 12:40
  • @tym32167: Спасибо! – VladD Dec 15 '17 at 13:11

1 Answers1

13

Берем ваш JSON

string json = @"{
   left: {
       left: ""Первое предложение из произвольной строки"",
       right: {
           left: ""Другое произвольное предложение"",
           right: ""Еще одно следующее предложение, но не очень длинное""
       }
   },
   right: {
       left: {
           left: {
               left: ""Еще одно не очень длинное предложение"",
               right: """"
           }, 
           right: {
               left: """",
               right: ""Еще одно не очень длинное предложение""
           }
       },
       right: {
           left: {
               left: ""Предложение"",
               right: ""Еще одно следующее предложение, но не очень длинное""
           },
           right: {
               left: ""Другое произвольное предложение"",
               right: {
                   left: ""Два слова"",
                   right: ""Еще одно следующее предложение, но не очень длинное""
               }
           }
       }
   }
}";

Генерируем классы для него тут http://json2csharp.com/ (также в студии можно использовать специальную вставку Paste Special. Для этого надо предвариетльно json скопировать в буфер обмена.)

Paste Special

public class Right
{
    public string left { get; set; }
    public string right { get; set; }
}

public class Left { public string left { get; set; } public Right right { get; set; } }

public class Left3 { public string left { get; set; } public string right { get; set; } }

public class Right3 { public string left { get; set; } public string right { get; set; } }

public class Left2 { public Left3 left { get; set; } public Right3 right { get; set; } }

public class Left4 { public string left { get; set; } public string right { get; set; } }

public class Right6 { public string left { get; set; } public string right { get; set; } }

public class Right5 { public string left { get; set; } public Right6 right { get; set; } }

public class Right4 { public Left4 left { get; set; } public Right5 right { get; set; } }

public class Right2 { public Left2 left { get; set; } public Right4 right { get; set; } }

public class RootObject { public Left left { get; set; } public Right2 right { get; set; } }

Для десериализации я использую библитеку https://www.newtonsoft.com/json - её можно скачать через nuget (https://www.nuget.org/packages/Newtonsoft.Json/). После подключения библиотеки, десериализуем JSON в объект

var myObject = JsonConvert.DeserializeObject<RootObject>(json);

Для новых версий .NET можно использовать System.Text.Json вместо Newtonsoft.Json, код почти такой же.

var myObject = JsonSerializer.Deserialize<RootObject>(json);

Готово.

aepot
  • 49,560
tym32167
  • 32,857
  • Да, неправильно использовала объект. СПАСИБО!!! – combo Oct 27 '17 at 21:53
  • @combo если мой ответ вам помог, отметье его как правильный пожаслуйста. – tym32167 Oct 27 '17 at 22:36
  • Вы уверены, что с такой моделью удобно работать? –  Oct 28 '17 at 07:49
  • @FoggyFinder я где то писал про удобство? Вопрос был в том, как распарсить json. Это сделано? - сделано. Автору помогло? - помогло. Если автору понадобится изменить модель - он сможет это сделать? - сможет. Или вы предлагаете руками модели писать? – tym32167 Oct 28 '17 at 07:58
  • @tym32167 да, конечно - для таких форматов только руками, иначе получится набор малопонятных классов. –  Oct 28 '17 at 07:59
  • @tym32167 не думаю, что автор сам сможет изменить модели и нормально распарсить, я думаю, что автор и про JSON.Net узнал только из вашего ответа. –  Oct 28 '17 at 08:00
  • 2
    @FoggyFinder я просто дал рыбаку удочку. А вы предлагаете дать рыбу. А если структура json изменится, автору снова писать вопрос про парсинг? А если автору надо будет другой json распарсить, снова спрашивать про модели? Автор ведь сам не сможет ни сгенерировать, ни написать модель, если вы ему сами будете это каждый раз делать за автора. – tym32167 Oct 28 '17 at 08:04
  • @tym32167 извините, но на мой взгляд вы дали ему плохую рыбу - удочка это первая часть вашего ответа. Руководствуясь вашей логикой лучше было не предоставлять никакой моделей. –  Oct 28 '17 at 08:08
  • @FoggyFinder вопрос тут предельно четкий - как распарсить json. оптимизация автосгенерированного кода - это уже отдельная тема. написание моделей для десериализации json руками - имхо так себе совет для начинающего девелопера, который, как вы говорите, даже существующую модель поправить не может – tym32167 Oct 28 '17 at 08:09
  • @tym32167 не желаете дополнить ответ для новых версий .NET? – Andrei Khotko Apr 13 '21 at 12:38
  • @AndreiKhotko я уже года полтора не писал на дотнете ничего. Потому если видите, что ответ не полный, то можете его обновить, я вам доверяю :) – tym32167 Apr 13 '21 at 12:49