2016-03-22 2 views
2

私は気象データを処理するためにRCPクライアントで作業していました。私のRCPクライアントがオブジェクトの深いコピーを返していない

2つのことは、まずJSONをスクラップして使用し、ダーツファイルに入れます。参照:https://dartpad.dartlang.org/a9c1fe8ce34c608eaa28

マイserver.dartページを、気象データをインポートし、次を行います:

import "dart:io"; 
import "weather_data.dart"; 
import "dart:convert"; 
import "package:rpc/rpc.dart"; 

find ApiServer _apiServer = new ApiServer(prettyPrint:true); 
main() async { 
    Weather w = new Weather(WeatherJson); 
    TestServer ts = new TestServer(w); 
    _apiServer.addApi(ts); 
    HttpServer server = await HttperServer.bind(InternetAddress.ANY_IP_V4, 12345); 
    server.listen(_apiServer.httpRequestHandler); 
} 

class Weather{ 
    Map weather; 
    Weather(this.weather){ 
    Map get daily => weather["daily"]; 
    } 
} 

@ApiClass(name:"test_server", version: 'v1', description: 'This is a test server api to ping for some quick sample data.') 
class TestServer { 
    Weather myWeather; 
    TestServer(this.myWeather){ 

    } 

    @ApiMethod(method:'GET', path: 'daily') 
    Map<String, Object> getDaily(){ 
    return myWeather.daily; 
    } 
} 

ので、サーバーは正常に起動し、私はlocalhost:12345/test_server/v1/dailyに行くだろうし、それが返されますこれは:

{ 
"summary": {}, 
"icon": {}, 
"data": {} 
} 

が正しくありません。 JSONデータを検索すると、要約とアイコンは両方とも文字列であり、データは配列です。それらは空でもあり、私が戻したいデータが入っているはずです。

これはなぜ発生するのですか?それは私がMap<String, Object>を返すからですか?私はそれを設定しようとしていた:Map<String, dynamic>しかし、ダーツコンパイラはそれを好きではなかった。

このデータで正しいデータセットを返すにはどうすればよいですか?

RPCのDart Webサイトはhttps://github.com/dart-lang/rpc にあります。メソッドの戻り値は、クラスのインスタンスか未来のどちらかのメソッドであることがわかります。それはいつものように意味があるので、私はそれをMap<String,Object>に設定しましたが、それについてあいまいにしようとしましたが、Mapでは十分ではありませんでした。

編集:RPCせず、主にダートパッドでこれを行う場合は

、のサンプルで、正常に動作するようです:https://dartpad.dartlang.org/3f6dc5779617ed427b75

これは何かが解析ツールを使用して間違っていると信じて私をリードダーツパッドの戻り値の型は、MapMap<String, Object>、およびMap<String, dynamic>を返すことができます。

class ResourceMessage { 
    int id; 
    String name; 
    int capacity; 
} 

+0

ダウンボートの理由が好きですか?私はこれが堅実なコードの例でよく考えられた質問であると信じています。 – Fallenreaper

+0

あまり心配しないでください。誰かがコメントを残さずに改善しなければならないものは、無視することをお勧めします。私はRPCを使用していないので、問題が何であるか分かりません。 –

答えて

1

がここRPCパッケージのREADME https://pub.dartlang.org/packages/rpcで簡単に見ていたた、次のような単純なフィールドを持つクラスのインスタンスを返す必要があります方法は、(@ApiMethod付き)APIメソッドとしてマークされているようですRPCパッケージはそのインスタンスを取得し、フィールド名に基づいてJSONにシリアル化します。

READMEから:

MyResponseクラスには、必要なパラメータを取っていない無名の コンストラクタで非抽象クラスでなければなりません。 RPCのバックエンドは、あなたがRPC操作を発するようにしたいとことを推測するJSONのネストされたMap表現を戻ってきている... JSONにMyResponse インスタンスのすべてのパブリックフィールドをシリアル化し、自動的に

を ますRPCパッケージは期待通りにRPCを処理しません。

日時:これはあなたの質問から:

dartpadでの戻り値の型は、地図、地図、および地図を返すことができそうです として何かが解析ツールを使用して間違っていると信じて私をリードしています。

あなたの例で行われているJSONには「解析」はありません。あなたが持っているデータは、ネストされたリテラルダートMapListおよびStringのセットで、それが派生したJSONと同じ構造です。 JSONのように見えます。

あなただけ toString()を呼び出した結果 Stringを出力し、あなたのデータマップ( data['daily'])、のサブマップを選択して印刷しているあなたの例では

- 再帰的であるあなたは、すべてのネストされたマップの内容を取得するようにその中のリスト。

これは「ディープコピー」の問題ではなく、toString()とRPCコードがネストマップのセットを処理する方法の違いです。

ご連絡:getDaily()メソッドの返品タイプは重要ではありません。返されるのは、メソッドの宣言された戻り値の型が何であれ、ただMapです。 Dartのタイプを記憶しておくことはオプションであり、編集者やコンパイラが間違ったコードを発見する可能性があります。 https://www.dartlang.org/docs/dart-up-and-running/ch02.html#variablesを参照してください。

+0

これを解決するにはどうすればいいですか?結果を文字列化し、それをクライアント上で解析しますか?それは有効な答えですが、もっともらしくないものです。あなたの答えは非常に有益ですが、私はこれをRPC Githubで見ましたが、 'クラスのパブリックフィールドだけがエンコード/デコードされています。パブリックフィールドの現在サポートされている型はint、double、bool、String、DateTime、List、Map、および別のメッセージクラスです。 ' – Fallenreaper

0

@Argenti装置をここでピギーバックするつもりですが、彼から得られた多くの情報があったためです。

かいつまんで、方法の必要な戻り値の型:

@ApiMethod(method:'GET', path: 'daily') 
Map<String,Object> getDaily(){  // <-- Map<String,Object> 
    return myWeather.daily; 
} 

はエラーです。

私は行って、メソッドシグネチャをMap<String,String>に更新し、完全に正しいと解釈しました。このオブジェクトは文字列として解析されませんでしたが、実際には完全な再帰オブジェクトとして解析されました。

コードの清潔さのために、Weatherプロパティのシグネチャを変更して、実際の内容(Map<String,Object>も同様)を反映させました。

全体として、Objectの値型として定義すると、中括弧が返されていましたが、文字列として正しく設定されていました。

私はそれが正しいことを確認するためにJSLintを通して実行しました。

私はヘルパーに+1を与えました。私はコードに深く掘り下げて参照する必要がありましたWHYマップを正しく行っていませんでした。

これも私はRPC Dartのバグだと感じています。

+0

喜んで助けてください。私はこれがRPSパッケージそのもののバグだとは思っていませんが、おそらくマップを扱う方法に関する文書がないかもしれません。あなたは異種地図のタイプとしてMap を使用することを検討するかもしれません。 –

+0

私はそれを打ち負かし、 'Map 'を試みました.Dartコンパイラは、動的に使用されているものよりもヒザフィットを投げていました。 – Fallenreaper

+0

コンパイラ?これはサーバー側のコードですそれについて実際に不平を言っているのは何ですか?ところで、もしあなたがそう思っているなら、あなたの質問に答えて私の答えを受け入れることができますか? –

関連する問題