Json.NET (Newtonsoft.Json) – Два «свойства» с таким же именем?

Я кодирую в C # для .NET Framework 3.5.

Я пытаюсь разобрать Json для JObject.

Json выглядит следующим образом:

{ "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 очень хорошим. Я действительно не хочу общаться с другими фреймворками, если я могу избежать этого.

Любая помощь будет принята с благодарностью.

У меня очень ограниченный вклад в изменения, которые могут быть внесены на сервер.

 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 } ] } 

И относитесь к нему так же, как к массиву.

  • Атрибут .NET DefaultValue
  • Можно ли установить частную собственность через reflection?
  • Как ссылаться на другое свойство в java.util.Properties?
  • Причина использования ivars против свойств в объекте c
  • Создайте массив свойств целых чисел в Objective C
  • Как проверить, имеет ли объект определенный метод / свойство?
  • C # настройка / получение свойств classа по имени строки
  • Программный доступ к свойствам, созданным заполнитель свойств
  • Аутентифицированная среда равна нулю
  • Перечисление через свойства объекта (строка) в C #
  • Когда использовать val или def в чертах Scala?
  • Давайте будем гением компьютера.