Анализ JSON с помощью Dart

Я хочу иметь возможность разобрать строку на объект, к которому я могу получить доступ, используя точечную запись, например. myobject.property вместо обозначения массива, например. мой объект['свойство']. Обозначение массива работает нормально. Вот что у меня есть до сих пор.

У меня есть некоторый XML:

<level1 name="level1name">
  <level2 type="level2Type">
    <entry>level2entry</entry>
    <entry>level2entry</entry>
  </level2>
</level1>

Который преобразуется в JSON:

{
  "level1": {
    "name": "level1name",
    "level2": {
      "type": "level2Type",
      "entry": [
        "level2entry",
        "level2entry"
      ]
    }
  }
}

У меня есть следующий код Dart:

Object jsonObject = JSON.parse("""{
      "level1": {
        "name": "level1name",
        "level2": {
          "type": "level2Type",
          "entry": [
            "level2entry",
            "level2entry"
          ]
        }
      }
    }
""");

  print("my test 1 == ${jsonObject}");
  print("my test 2 == ${jsonObject['level1']}");
  print("my test 3 == ${jsonObject['level1']['name']}");

который выдает (желаемый) вывод:

my test 1 == {level1: {name: level1name, level2: {type: level2Type, entry: [level2entry, level2entry]}}}
my test 2 == {name: level1name, level2: {type: level2Type, entry: [level2entry, level2entry]}}
my test 3 == level1name

Но когда я пытаюсь:

print("my test 1 == ${jsonObject.level1}");

Я получить следующее:

Exception: NoSuchMethodException : method not found: 'get:level1'
Receiver: {level1: {name: level1name, level2: {type: level2Type, entry: [level2entry, level2entry]}}}
Arguments: []
Stack Trace:  0. Function: 'Object.noSuchMethod' url: 'bootstrap' line:717 col:3

В идеале мне нужен объект, к которому я могу получить доступ, используя точечную нотацию и без предупреждения компилятора о том, что объект не имеет свойства. Я попробовал следующее:

class MyJSONObject extends Object{
  Level1 _level1;
  Level1 get level1() => _level1;
  set level1(Level1 s) => _level1 = s; 
}

class Level1 {
  String _name;
  String get name() => _name;
  set name(String s) => _name = s; 
}
...
MyJSONObject jsonObject = JSON.parse("""{
      "level1": {
        "name": "level1name",
        "level2": {
          "type": "level2Type",
          "entry": [
            "level2entry",
            "level2entry"
          ]
        }
      }
    }
""");
...
print("my test 1 == ${jsonObject.level1.name}");

, но вместо того, чтобы дать мне 'level1name', как я надеялся, я получил:

Exception: type 'LinkedHashMapImplementation<String, Dynamic>' is not a subtype of type 'MyJSONObject' of 'jsonObject'.

Что я здесь делаю неправильно? Есть ли способ сделать то, что я пытаюсь? Спасибо.

8
задан Charles 2 February 2014 в 08:20
поделиться