我希望能够将字符串解析为我可以使用点表示法访问的对象,例如myobject.property,而不是数组表示法,例如myobject ['property'].数组表示法工作正常.这是我到目前为止所拥有的.
我有一些XML:
<level1 name="level1name">
<level2 type="level2Type">
<entry>level2entry</entry>
<entry>level2entry</entry>
</level2>
</level1>
Run Code Online (Sandbox Code Playgroud)
哪个转换为JSON:
{
"level1": {
"name": "level1name",
"level2": {
"type": "level2Type",
"entry": [
"level2entry",
"level2entry"
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有以下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']}");
Run Code Online (Sandbox Code Playgroud)
产生(所需)输出:
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
Run Code Online (Sandbox Code Playgroud)
但是当我尝试:
print("my test 1 == ${jsonObject.level1}");
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
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
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想要一个可以使用点表示法访问的对象,并且编译器不会发出有关没有属性的Object的警告.我尝试了以下方法:
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}");
Run Code Online (Sandbox Code Playgroud)
但不是像希望的那样给我'level1name',而是得到:
Exception: type 'LinkedHashMapImplementation<String, Dynamic>' is not a subtype of type 'MyJSONObject' of 'jsonObject'.
Run Code Online (Sandbox Code Playgroud)
我在这做错了什么?有什么方法可以做我正在尝试的事情吗?谢谢.
Chr*_*ett 12
目前,JSON.parse只返回Lists(数组),Maps,String,num,bool和null(api ref).
我怀疑,直到反射进入语言,它将无法根据json中找到的键重新构造对象.
但是,您可以在MyJsonObject中创建一个构造函数,该构造函数在内部使用一个名为JSON.parse的字符串,并为其分配各种值.
这样的东西在飞镖编辑器中起作用:
#import("dart:json");
class Level2 {
var type;
var entry;
}
class Level1 {
var name;
var level2;
}
class MyJSONObject {
Level1 level1;
MyJSONObject(jsonString) {
Map map = JSON.parse(jsonString);
this.level1 = new Level1();
level1.name = map['level1']['name'];
level1.level2 = new Level2();
level1.level2.type = map['level1']['level2']['type'];
//etc...
}
}
main() {
var obj = new MyJSONObject(json);
print(obj.level1.level2.type);
}
Run Code Online (Sandbox Code Playgroud)
如果你有更深的嵌套级别,一个非平凡的版本需要一些循环和可能的递归.
更新:我已经攻击了一个非平凡的版本(灵感来自下面的帖子),它在github上(也把Seth的评论作为构造函数):
| 归档时间: |
|
| 查看次数: |
5201 次 |
| 最近记录: |