1

我刚刚开始学习飞镖,我想尝试从 json 字符串创建一个简单的对象列表。我正在使用 AngularJS phonecat 教程尝试将其转换为 Dart ......因此,在我的 dart 文件中,我有这个......

import "dart:json" as json;
import "package:json_object/json_object.dart";

String jsonPhones = """
  [{"name": "Nexus S",
    "snippet": "Fast just got faster with Nexus S."},
   {"name": "Motorola XOOM™ with Wi-Fi",
    "snippet": "The Next, Next Generation tablet."},
   {"name": "MOTOROLA XOOM™",
    "snippet": "The Next, Next Generation tablet."}]
""";


class Phone {
  String name;
  String snippet;
}

class PhoneImpl extends JsonObject implements Phone {
  PhoneImpl();

  factory PhoneImpl.fromJsonString(string) {
    return new JsonObject.fromJsonString(string, new PhoneImpl());
  }
}

List<Phone> Phones;

void main() {
  PhoneImpl pi = new PhoneImpl.fromJsonString(jsonPhones);
  for(var i = 0; i < pi.length; i++) {
    print(pi[i].name);
  }
}

所以,当我运行它时,它会打印出每部手机的名称。但是,如果我尝试 Phones.add(pi[i]),我会在成员名称 add 上收到类型为“noSuchMethod()”的错误。我假设此时的 pi[i] 是一个 JsonObject 并且不会自动转换为 Phone 类型。最终我想做的是使用......

<li template iterate="phone in Phones"> 

在 html 中遍历手机。我尝试使用 PhoneImpl 执行此操作,但随后出现另一个错误,提示 NoSuchMethodError memberName "containsKey"。所以我假设我需要想办法让我的列表从 PhoneImpl 到 List ,到目前为止我似乎无处可去。此外,我宁愿不必用 JsonObject 扩展我的所有模型。事实上,我也试过在没有 json_object 包的情况下完成所有这些工作,但似乎仍然无法让它工作。

4

3 回答 3

3

这是我处理它的方式:

import "dart:json";

String jsonPhones = """
  [{"name": "Nexus S",
    "snippet": "Fast just got faster with Nexus S."},
   {"name": "Motorola XOOM™ with Wi-Fi",
    "snippet": "The Next, Next Generation tablet."},
   {"name": "MOTOROLA XOOM™",
    "snippet": "The Next, Next Generation tablet."}]
""";

class Phone {
  String name;
  String snippet;

  Phone(this.name, this.snippet);
}

List<Phone> Phones;
void main() {
  Phones = parse(jsonPhones).map((e) => new Phone(e["name"], e["snippet"]);
  // do something with Phones...
}

在这种情况下,parse()将返回一个列表,但这并不总是正确的,因此在生产中,我建议您进行检查parse()以确保您实际上得到了您所期望的。这种模式避免了您的 PhoneImpl 类,这似乎只是一个垫片。

Dart 团队希望实现反射,这样可以更好地直接编组到 Phone 实例,但这还没有完成。

于 2013-02-19T06:50:35.607 回答
0

tjameson 的回答是我目前将采取的方法,但这里有一些关于您在使用 JsonObject 时遇到的问题的背景知识。

您遇到的部分问题是,尽管 JsonObject 确实将 Json 对象列表转换为列表,但 JsonObject 本身并未实现 List 接口。

该行:

PhoneImpl pi = new PhoneImpl.fromJsonString(jsonPhones);

实际上导致pi包含 JsonObjects 列表,而不是单个 JsonOjbect。然后,当phone in phones迭代器尝试迭代该列表时,它找不到iterator对象(因为JsonObject没有实现 List 接口 - 请随意提出问题以便我可以跟踪它- 并添加支持。

如果您对使用镜像感兴趣,那么此分支中有 JsonObject 的实验性镜像 API

于 2013-02-19T10:00:12.500 回答
0

试试这个库。它使用反射来做你想做的事,但因为 Dart 只有一个异步 API 用于使用反射读取和设置值,所以你挥手等待返回的未来完成。

https://github.com/chrisbu/dartwatch-JsonObject

于 2013-02-20T01:52:03.777 回答