2017-06-16 12 views
4

Flutterはダーツを取り込んだので、SDKのミラーを使用していないため、JSONのdartsonのようなライブラリを使用して直列化/逆シリアル化を処理できなくなりました。しかし、私はbuilt_valueが似たような目的を達成する別の方法だと読んだことがあります。相当量のボイラープレートコードが含まれているため、どのように実装するのかについての良い例は見つかりませんでした。誰かが私に例を与えることができますか?例えば、これは私がオブジェクトにシリアライズしようとしているJSONです:FlutterのオブジェクトへのJSONのシリアライゼーションと逆シリアル化

{ 
"name":"John", 
"age":30, 
"cars": [ 
    { "name":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] }, 
    { "name":"BMW", "models":[ "320", "X3", "X5" ] }, 
    { "name":"Fiat", "models":[ "500", "Panda" ] } 
] 

}

答えて

1

あなたはあなたのダーツのソースを解析し、.g.dartを生成しますBuilt_value用の設定ファイルを準備する必要があります。準備ができたら、jsonのシリアル化が自動的に行われます。これらのファイルは、一度だけ生成することも、監視コマンドを使用して生成することもできます。

これらのファイルは、同じクラスとして見られることを

part of data; 

ソースとダーツコマンドと同じレベルで添加されます。

import 'dart:async'; 

import 'package:build_runner/build_runner.dart'; 
import 'package:built_value_generator/built_value_generator.dart'; 
import 'package:source_gen/source_gen.dart'; 


Future main(List<String> args) async { 

await build(

new PhaseGroup.singleAction(

new GeneratorBuilder([ 

new BuiltValueGenerator(), 

]), 

new InputSet('flutter_project', const ['lib/data/*.dart'])), 

deleteFilesByDefault: true); 

} 

あなたが利点を理解するためにデビッド・モーガンのすべての記事を読むことが役立つことがあります。

は、ここで私は私のフラッタのプロジェクトで使用している設定です。あなたの心を回すには時間が必要ですが、それはとても良いパターンです。

https://medium.com/dartlang/darts-built-value-for-immutable-object-models-83e2497922d4

https://medium.com/dartlang/darts-built-value-for-serialization-f5db9d0f4159

トリックを解析し、ビルダーとシリアライザのような行動の多くを追加することで、クラスを豊かsourcegen方法を理解することです。

The dart:convert library provides a JsonCodec class, which you can use to convert simple types (map, list, int, num, string) automatically from a and to a JSON string. The two key static methods are JSON.encode(object) and JSON.decode(string) .

デコード例:

import 'dart:convert'; 
...  
Map<String, dynamic> parsedMap = JSON.decode(json); 
print(parsedMap['name']); // John 
print(parsedMap['age']); // 30 

エンコード例:

Map<String, dynamic> mapData = <String, dynamic>{ 'hello': 'world!' }; 
String jsonData = JSON.encode(mapData); // convert map to String 

あなたはJSONはするのではなく、カスタムダートクラスに膨らま持つようにしたい場合はDart web siteから

+0

こんにちは、ロバート。お返事をありがとうございます!私はまだこれがどのように動作するのか混乱しています。申し訳ありませんが、フラッタとダーツの新人です。あなたの答えに詳細を追加できますか?または、詳細を示す他のリンクを教えてください。私はまだ私が与えたJSONの例でこれがどのように機能するのかよく分かりません – user3217522

0

原始的なオブジェクトの木、Hadrienの答えは正しい方向にあなたを指すはずですが、私は他の誰かがJSONのシリアライゼーション/デシリアライゼーションの基本的な作業をしようとしている場合に備えて、このままにしておきたいと思います。

5

私は、提供された回答からさらに詳細を期待していました。彼らは良い提案であったにもかかわらず、私が理解するにはあまりにも一般的でした。私自身の研究をした後、他の誰かの時間を節約することを期待して、上記のJSONの例に実装を分けます。だからここに私は、その後の手順です:私のフラッタープロジェクトで

  • は最初、私は次のライブラリをインポート:

dependencies:

built_value: ^1.0.1
built_collection: ^1.0.0

dev_dependencies:

build_runner: ^0.3.0
built_value_generator:^1.0.1

  • 私はツールと呼ばれるフォルダを作成しました。その中にbuild.dartとwatch.dartの2つのファイルを置いています。これらのファイルの存在の実装がある私は私のJSON文字列をシリアル化でしょうserializers.dartファイルを作成し

build.dart

// Copyright (c) 2015, Google Inc. Please see the AUTHORS file for details. 
// All rights reserved. Use of this source code is governed by a BSD-style 
// license that can be found in the LICENSE file. 

import 'dart:async'; 

import 'package:build_runner/build_runner.dart'; 
import 'package:built_value_generator/built_value_generator.dart'; 
import 'package:source_gen/source_gen.dart'; 

/// Example of how to use source_gen with [BuiltValueGenerator]. 
/// 
/// Import the generators you want and pass them to [build] as shown, 
/// specifying which files in which packages you want to run against. 
Future main(List<String> args) async { 
    await build(
     new PhaseGroup.singleAction(
      new GeneratorBuilder([new BuiltValueGenerator()]), 
      new InputSet('built_value_example', const [ 
      'lib/model/*.dart', 
      'lib/*.dart', 
      ])), 
     deleteFilesByDefault: true); 
} 

watch.dart

// Copyright (c) 2016, Google Inc. Please see the AUTHORS file for details. 
// All rights reserved. Use of this source code is governed by a BSD-style 
// license that can be found in the LICENSE file. 

import 'dart:async'; 

import 'package:build_runner/build_runner.dart'; 
import 'package:built_value_generator/built_value_generator.dart'; 
import 'package:source_gen/source_gen.dart'; 

/// Example of how to use source_gen with [BuiltValueGenerator]. 
/// 
/// This script runs a watcher that continuously rebuilds generated source. 
/// 
/// Import the generators you want and pass them to [watch] as shown, 
/// specifying which files in which packages you want to run against. 
Future main(List<String> args) async { 
    watch(
     new PhaseGroup.singleAction(
      new GeneratorBuilder([new BuiltValueGenerator()]), 
      new InputSet('built_value_example', const [ 
      'lib/model/*.dart', 
      'lib/*.dart'])), 
     deleteFilesByDefault: true); 
} 
  • 下回っショー私のカスタムダーツオブジェクトと私のモデルオブジェクトperson.dart

serializers.dart

library serializers; 

import 'package:built_collection/built_collection.dart'; 
import 'package:built_value/serializer.dart'; 
import 'package:built_value/standard_json_plugin.dart'; 
import 'model/person.dart'; 

part 'serializers.g.dart'; 

Serializers serializers = (
    _$serializers.toBuilder()..addPlugin(new StandardJsonPlugin()) 
).build(); 

person.dart

library person; 

import 'package:built_collection/built_collection.dart'; 
import 'package:built_value/built_value.dart'; 
import 'package:built_value/serializer.dart'; 

part 'person.g.dart'; 

abstract class Person implements Built<Person, PersonBuilder> { 
    String get name; 
    int get age; 
    BuiltList<Car> get cars; 

    Person._(); 
    factory Person([updates(PersonBuilder b)]) = _$Person; 
    static Serializer<Person> get serializer => _$personSerializer; 
} 

abstract class Car implements Built<Car, CarBuilder> { 
    String get name; 
    BuiltList<String> get models; 

    Car._(); 
    factory Car([updates(CarBuilder b)]) = _$Car; 
    static Serializer<Car> get serializer => _$carSerializer; 
} 
  • 上記の4つのファイルを作成したら、それはいくつかのコンパイルエラーが表示されます。まだ気にしないでください。これは、build.dartファイルがまだ実行されていないためです。このステップでは、build.dartを実行します。 Webstormを使用している場合は、単にbuild.dartを右クリックし、 "Run build.dart"を押してください。これにより、 "person.g.dart"と "serializers.g.dart"という2つのファイルが作成されます。注意深く気付いた場合は、build.dartファイルで、 'lib/model/.dart'と 'lib/ .dart'と入力します。ビルドは、指定されたパスを通ってファイルを探す場所を知り、 "何か"が含まれているファイルを探します。したがって、build.dartファイルを実行する前にそれらのファイルにその行を保持することが重要です。

  • 最後に、main.dartファイルでシリアライザを使用してjson文字列をカスタムダーツオブジェクトクラスPersonにシリアル化します。私のmain.dartでは、私は

main.dart

Person _person; 

    @override 
    void initState() { 
    super.initState(); 
    String json = "{" 
     "\"name\":\"John\",\"age\":30,\"cars\": " 
     "[" 
     "{ \"name\":\"Ford\", \"models\":[ \"Fiesta\", \"Focus\", \"Mustang\" ] }," 
     "{ \"name\":\"BMW\", \"models\":[ \"320\", \"X3\", \"X5\" ] }," 
     "{ \"name\":\"Fiat\", \"models\":[ \"500\", \"Panda\" ] }" 
     "]}"; 

    setState(() { 
     _person = serializers.deserializeWith(
      Person.serializer, JSON.decode(json)); 
    }); 
    } 

私のサンプルプロジェクトは、あなたがジャガーシリアライザを使用することができますGitHubのBuilt value sample project

+0

あなたのソリューションを共有してくれてありがとう。しかし、私はPersonクラスをインスタンス化し、値を設定してexempleにしたいときに問題に遭遇しました。セッターがないので不可能です。それに対処する解決策はありますか?私は私のプロジェクトに同じクラスを使用したいとシリアル化 – toregua

1

でも可能です)(initStateに次のコードを追加しましたFlutter、Server、およびWeb開発者にとっては、簡単に起動して作業することができます。

https://github.com/Jaguar-dart/jaguar_serializer

+0

このlibは面白そうです!私はそれを試してみましたが、シリアライザのビルドを実行すると、このエラーが発生します: 'パッケージ:jaguar_generator_config/src/generator.dart':エラー:行17:受信者への不正な暗黙的アクセス 'this' _config = loadYaml(新しいファイル( configFileName)。readAsStringSync()); – user3217522

+0

問題が発生しました。https://stackoverflow.com/questions/44634860/error-when-running-serializer-build-in-jaguar-serializer – user3217522

関連する問題