Json.NET (Newtonsoft.Json) – Два «свойства» с таким же именем?
Я кодирую в C # для .NET Framework 3.5.
Я пытаюсь разобрать Json для JObject.
Json выглядит следующим образом:
- Загрузить файл свойств в Servlet / JSP
- Как пропустить Получить только свойства в servicestack json serializer?
- Имущество (без дополнительной обработки) против публичного поля
- Свойство DependencyProperty для представления twoway-bind для свойства viewmodel?
- Получить список свойств объекта в Objective-C
{ "TBox": { "Name": "SmallBox", "Length": 1, "Width": 1, "Height": 2 }, "TBox": { "Name": "MedBox", "Length": 5, "Width": 10, "Height": 10 }, "TBox": { "Name": "LargeBox", "Length": 20, "Width": 20, "Height": 10 } }
Когда я пытаюсь разобрать этот Json в JObject, JObject знает только о LargeBox. Информация для SmallBox и MedBox потеряна. Очевидно, это потому, что он интерпретирует «TBox» как свойство, и это свойство перезаписывается.
Я получаю этот Json от службы, которая закодирована в Delphi. Я пытаюсь создать прокси-сервер C # для этой службы. С точки зрения Delphi, «TBox» понимается как тип возвращаемого объекта. Внутренние свойства («Имя», «Длина», «Ширина», «Высота») затем понимаются как регулярные свойства.
Я могу сериализовать и десериализовать пользовательский объект «TBox», который имеет свойства Name, Length, Width и Height. Хорошо.
То, что я хочу сделать, – это пройти через все разделы TBox таким образом, чтобы извлечь следующие три строки Json.
Первый:
{ "Name": "SmallBox", "Length": 1, "Width": 1, "Height": 2 }
Во-вторых:
{ "Name": "MedBox" "Length": 5, "Width": 10, "Height": 10 }
В третьих:
{ "Name": "LargeBox" "Length": 20, "Width": 20, "Height": 10 }
Как только у меня появятся эти строки, я могу сериализовать и десериализовать содержимое моего сердца.
Я нахожу Newtonsoft.Json очень хорошим. Я действительно не хочу общаться с другими фреймворками, если я могу избежать этого.
Любая помощь будет принята с благодарностью.
У меня очень ограниченный вклад в изменения, которые могут быть внесены на сервер.
- `def` vs` val` vs `lazy val` в Scala
- Недвижимость против ivar во времена ARC
- C # настройка / получение свойств classа по имени строки
- свойство classа маркировки c # как грязное
- Динамически добавлять свойства C # во время выполнения
- Создайте массив свойств целых чисел в Objective C
- Создание родового имущества
- Сжатие файлов Log4j
using Newtonsoft.Json; using Newtonsoft.Json.Linq; JsonTextReader jsonReader = new JsonTextReader(reader); jsonReader.Read(); while(jsonReader.Read()) { if(jsonReader.TokenType == JsonToken.StartObject) { JObject tbox = JObject.Load(jsonReader); } }
вusing Newtonsoft.Json; using Newtonsoft.Json.Linq; JsonTextReader jsonReader = new JsonTextReader(reader); jsonReader.Read(); while(jsonReader.Read()) { if(jsonReader.TokenType == JsonToken.StartObject) { JObject tbox = JObject.Load(jsonReader); } }
Однако обратите внимание, что RFC говорит: «Имена внутри объекта ДОЛЖНЫ быть уникальными», поэтому, если вы можете, рекомендуется изменить формат.
EDIT: Вот альтернативный дизайн, который не имеет дубликатов ключей:
[ { "TBox": { "Width": 1, "Length": 1, "Name": "SmallBox", "Height": 2 } }, { "TBox": { "Width": 10, "Length": 5, "Name": "MedBox", "Height": 10 } }, { "TBox": { "Width": 20, "Length": 20, "Name": "LargeBox", "Height": 10 } } ]
Если я не ошибаюсь, правильный ответ на этот вопрос заключается в том, что ваш вход не является JSON. Так что нет, получение парсера JSON для его анализа, вероятно, не сработает.
Возможно, у вас нет никакого контроля над источником ввода, поэтому я бы использовал Regex или что-то, чтобы предварительно фильтровать строку. Поверните его во что-то вроде:
{"TBoxes": [ { "Name": "SmallBox", "Length": 1, "Width": 1, "Height": 2 }, { "Name": "MedBox", "Length": 5, "Width": 10, "Height": 10 }, { "Name": "LargeBox", "Length": 20, "Width": 20, "Height": 10 } ] }
И относитесь к нему так же, как к массиву.