2013-08-19 12 views
5

Aşağıdaki kod baskılar:, ayrıştırılmış json haritalarını eşitlik açısından test etmenin iyi bir yolu nedir?

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

kod

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

onlar olmayacak umuduyla Set saklayarak, json kullanarak ve iki eşdeğer nesneleri ayrıştırma am çoğaltılamaz. Durum böyle değil ve ilk iki satırın (beklenmedik bir şekilde) yanlış olmasıyla sonuçlandığı anlaşılıyor. Her bir JSON.parse() sonucunun varsayıldığını varsayarak iki Harita nesnesini doğru bir şekilde karşılaştırmanın etkili bir yolu nedir?

cevap

2

cevap bkz artık geçerli değil = Haritalar ve Listeler'deki işleç, anahtarları/değerleri/öğeleri birbiriyle karşılaştırmaz.

Kullanım durumunuza bağlı olarak, bir yardımcı program yöntemi yazmanız gerekebilir. Bir keresinde bu hızlı ve kirli bir fonksiyon yazdım:

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

iç içe JSON nesneleri işleme sırasında, her zaman en kısa sürede iç içe listeler katılmaktadırlar olarak false dönecektir unutmayınız. Bu yaklaşımı kullanmak istiyorsanız, bunun için kod eklemeniz gerekebilir.

keresinde başladı başka bir yaklaşım

sonra bu sarmalayıcılarını kullanarak JSON dizeleri ayrıştırmak JsonParser ve JsonListener kullanın ve operator== geçersiz (normalde kullanmak için Harita/Listesini uygulayan) Harita ve Listesi için sarmalayıcılarını yazmaktı. Bunu çok erken terk ettiğim için, bunun için bir kodum yok ve gerçekten işe yarayıp yaramadığını bilmiyorum, ama denemeye değer.

3

Bu zor bir özellik çünkü JSON nesneleri yalnızca Listeler, Num, String, bool ve Null Haritalarıdır. Test Harita ve eşitliğe Listeleri, bkz hala Dart bir konudur https://code.google.com/p/dart/issues/detail?id=2217

GÜNCELLEME

Bu cevap, = gibi bu oldukça zor aslında @Patrice_Chalin

0

Unittest'ten kullanılan eşleyici kitaplığı bunu yapacak.

4

aşağıdaki paketin

import 'package:collection/equality.dart'; 

Örneğin dan Eşitlik sınıfları kullanmaktır eşitlik muhtemelen iç içeJSON haritalar veya listeleri karşılaştırmak için önerilen yol,

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 

ayrıntı için bkz Bu eşitlik bazı farklı eşitlik sınıfları hakkında konuşuyor: How can I compare Lists for equality in Dart?.

İlgili konular