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、単一の JsonOjbect ではなく、JsonObjects のリストが含まれます。次に、phone in phonesイテレーターがそのリストを反復しようとすると、iteratorオブジェクトを見つけることができません ( List インターフェースを実装していないためです。追跡できるように、JsonObjectお気軽に問題を提起してください。サポートを追加してください。

ミラーの使用に興味がある場合は、このブランチに JsonObject の実験的なミラー API があります。

于 2013-02-19T10:00:12.500 に答える
0

このライブラリを試してみてください。リフレクションを使用して目的を実行しますが、Dart にはリフレクションを使用して値を読み取り、設定するための非同期 API しかないため、返された Future が完了するまで手を振って待ちます。

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

于 2013-02-20T01:52:03.777 に答える