Мне нужно проверить, все ли элементы уникальны в массиве serde_json::Value
. Поскольку этот тип не реализует Hash
, я пришел к следующему решению:
use serde_json::{json, Value};
use std::collections::HashSet;
fn is_unique(items: &[Value]) -> bool {
let mut seen = HashSet::with_capacity(items.len());
for item in items.iter() {
if !seen.insert(item.to_string()) {
return false;
}
}
true
}
fn main() {
let value1 = json!([1, 2]);
assert!(is_unique(&value1.as_array().unwrap()));
let value2 = json!([1, 1]);
assert!(!is_unique(&value2.as_array().unwrap()));
}
Я предполагаю, что он должен работать, только если serde_json
построен с функцией preserve_order
(чтобы объекты сериализовались в один и тот же порядок каждый раз), но я не уверен на 100%.
Основной контекст использования :
JSON Проверка схемы. Реализация ключевого слова " uniqueItems ".
Пример использования
Дедупликация массивов JSON для оптимизации JSON Вывод схемы на них.
Например, входные данные [1, 2, {"foo": "bar"}]
. Прямой вывод может вывести это:
{
"type": "array",
"items": {
"anyOf": [
{"type": "integer"},
{"type": "integer"},
{"type": "object", "required": ["foo"]}
]
}
}
значения в items/anyOf
могут быть уменьшены только до двух значений.
Вопрос : Что будет наиболее эффективный и правильный способ проверить, что в произвольном массиве JSON нет дубликатов?
Я использовал serde_json = "1.0.48"
Rust : 1.42.0
Детская площадка