2013-08-19 4 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 и разбор двух эквивалентных объектов, сохраняя их в наборе, надеясь, что они не будут дублируется. Это не так, и кажется, что первые две строки (неожиданно?) Приводят к ложному. Каков эффективный способ правильного сравнения двух объектов Map, предполагающих каждый из них, был результатом JSON.parse()?

ответ

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

Пожалуйста, обратите внимание, что в то время как она обрабатывает вложенные объекты JSON, он всегда будет возвращать false как только вложенные списки участников. Если вы хотите использовать этот подход, вам может потребоваться добавить код для его обработки.

Другой подход, который я когда-то начал было писать обертки для карты и список (реализующие Карта/Список, чтобы использовать его, как правило) и переопределить operator==, а затем использовать JsonParser и JsonListener для разбора JSON строки, используя эти обертки. Поскольку я оставил это довольно скоро, у меня нет кода для этого и не знаю, действительно ли это сработало бы, но это может стоить попробовать.

3

Это сложный вопрос, потому что объекты JSON - это просто списки и карты num, String, bool и Null. Тестирование Карты и списки на равенство по-прежнему является проблемой в Дарта см https://code.google.com/p/dart/issues/detail?id=2217

UPDATE

Этот ответ не действует больше, см ответить @Patrice_Chalin

0

Библиотека сопряжения, используемая от unittest, сделает это.

4

Рекомендуемый способ сравнения карты в формате JSON или списки, возможно, вложенной, для равенства с помощью классов Равенства из следующего пакета

import 'package:collection/equality.dart'; 

Eg,

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?.

Смежные вопросы