2013-08-19 3 views
5

次のコードを印刷:解析されたjsonマップを平等のためにテストする良い方法は何ですか?

false 
false 
true 
{{a: b}, {a: b}} 

コード

import "dart:json" as JSON; 

main() { 
    print(JSON.parse('{ "a" : "b" }') == JSON.parse('{ "a" : "b" }')); 
    print({ "a" : "b" } == { "a" : "b" }); 
    print({ "a" : "b" }.toString() == { "a" : "b" }.toString()); 
    Set s = new Set(); 
    s.add(JSON.parse('{ "a" : "b" }')); 
    s.add(JSON.parse('{ "a" : "b" }')); 
    print(s); 
} 

私はJSONを使用して2つの同等のオブジェクトを解析し、セットに格納、彼らはされません期待しています重複したこれは当てはまりません。最初の2行(予期せず?)がfalseになるためです。それぞれがJSON.parse()の結果であると仮定して2つのMapオブジェクトを正しく比較する効率的な方法は何ですか?

答えて

2

に答える見ます= MapsとListsの演算子は実際にはキー/値/要素を互いに比較しません。

ユースケースによっては、ユーティリティメソッドを記述する必要があります。私はかつて、この間に合わせの機能を書いた:

bool mapsEqual(Map m1, Map m2) { 
    Iterable k1 = m1.keys; 
    Iterable k2 = m2.keys; 
    // Compare m1 to m2 
    if(k1.length!=k2.length) return false; 
    for(dynamic o in k1) { 
     if(!k2.contains(o)) return false; 
     if(m1[o] is Map) { 
      if(!(m2[o] is Map)) return false; 
      if(!mapsEqual(m1[o], m2[o])) return false; 
     } else { 
      if(m1[o] != m2[o]) return false; 
     } 
    } 
    return true; 
} 

それは、ネストされたJSONオブジェクトを扱う一方で、それはいつものようにすぐにネストされたリストが関与しているとしてfalseを返すことに注意してください。このアプローチを使用する場合は、これを処理するためのコードを追加する必要があります。

私は一度始めたもう一つのアプローチは、これらのラッパーを使用してJSON文字列を解析するためにJsonParserとJsonListenerを使用し、その後、(通常はそれを使用するマップ/リストを実装)地図とリストのためのラッパーを書いて、operator==を上書きすることでした。私はすぐにそれを放棄したので、私はそれのためのコードを持っていないし、実際に働いていたかどうかわからないが、試してみる価値があるかもしれない。

3

JSONオブジェクトはnum、String、bool、NullのLists and Mapsだけなので、これは難しいものです。平等でのテストマップとリストはまだダートでの問題であり、この答えは、もはや有効ではありませんhttps://code.google.com/p/dart/issues/detail?id=2217

UPDATE

を参照して、=と、これはかなり難しい、実際にある@Patrice_Chalin

0

unittestで使用されているmatcherライブラリがこれを行います。

4

JSONマップやリストを比較するための推奨方法、おそらくネスト、平等のための次のパッケージから

例えば、

詳細について
Function eq = const DeepCollectionEquality().equals; 
var json1 = JSON.parse('{ "a" : 1, "b" : 2 }'); 
var json2 = JSON.parse('{ "b" : 2, "a" : 1 }'); 
print(eq(json1, json2)); // => true 

が見

import 'package:collection/equality.dart'; 

を平等クラスを使用することですさまざまな平等授業のいくつかについて語っているこの回答:How can I compare Lists for equality in Dart?

関連する問題