8

次のコードが出力されます。

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 オブジェクトを正しく比較する効率的な方法は何ですか?

4

4 に答える 4

8

ネストされている可能性がある JSON マップまたはリストを比較して等しいかどうかを比較するための推奨される方法は、次のパッケージの Equality クラスを使用することです。

import 'package:collection/collection.dart';

例えば、

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

詳細については、さまざまな等価クラスのいくつかについて説明しているこの回答を参照してください: How can I compare Lists for equality in Dart? .

于 2014-03-13T14:35:27.343 に答える
3

JSON オブジェクトは、num、String、bool、および Null のリストとマップにすぎないため、これは難しいものです。Dart では、マップとリストの等価性をテストすることは依然として問題です。https://code.google.com/p/dart/issues/detail?id=2217を参照してください。

アップデート

この回答は無効になりました。回答 @Patrice_Chalin を参照してください。

于 2013-08-19T20:40:01.507 に答える
2

マップとリストの == 演算子は実際にはキー/値/要素を互いに比較しないため、これは実際にはかなり困難です。

ユース ケースによっては、ユーティリティ メソッドを作成する必要がある場合があります。私はかつて、この手っ取り早い汚い関数を書きました:

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;
}

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

私がかつて始めたもう 1 つのアプローチは、Map と List のラッパーを作成し (通常は Map/List を使用するように実装します)、 overrideを作成し、 JsonParseroperator==と JsonListener を使用して、それらのラッパーを使用して JSON 文字列を解析することでした。私はすぐにそれを放棄したので、コードがなく、本当にうまくいくかどうかわかりませんが、試してみる価値はあります.

于 2013-08-19T21:26:24.217 に答える