Стоит такая задача. Есть CSR(запросы на сертификаты). У них есть разные шаблоны, содержащие определенные поля. Я сериализую запрос и разбиваю его на:
{
"CSRName",
"Subject": [
],
"Extension": [
]
}
В поля субъект записывается, что в субъекте открытого ключа, в Extension все дополнительные строки, что и формируют разные шаблоны. Я сейчас пишу программу, которая будет проверять запрос на соответствие тому или иному шаблону. Для этого у меня будет создаваться tamplates1.json, tamplates2.json и т.д. шаблоны. И так суть. Запрос обязательно содержит много записей и в Subject и в Extension. Шаблон же может содержать одну или две строки в Extension. Как сравнить два таких шаблона и вывести true, если все значения в templates содержать в CSR. Пример CSR:
{
"CSRName": zapros1,
"Subject": [
{
"CN": "name",
"T":"Сотрудник"
}
],
"Extension": [
{"1.2.643.100.3"},
{"1.2.643.100.1"},
{"1.2.643.3.131.1.1"},
{"1.2.840.113549.1.9.1"},
{"2.5.4.6"},
{"2.5.4.8"},
{"2.5.4.7"},
{"2.5.4.10"},
{"2.5.4.11"},
{"2.5.4.3"},
{"2.5.4.9"},
{"2.5.4.12"},
{"2.5.4.42"},
{"2.5.4.4"}
]
}
И шаблон:
{
"CSRName",
"Subject": [
],
"Extension": [
{"1.2.643.100.3"},
{"1.2.643.100.1"}
]
}
Это true. И соответственно любое другое значение в других полях, которых нет в оригинальном - false.
Пытался через JToken.DeepEquals, но он всегда выдает false. Сравнивая я, соответственно, весь CSRJson с TempJson через JsonConvert.DeserializeObject<CSR>(File.ReadAllText(JSON_path))
В итоге я решил вытаскивать в виде List значения в полях и их сравнивать. Вот так:
public static bool JsonTemplateCompare(RequestSerialize request, RequestSerialize template)
{
List<Item> items = request.Fields.Item;
List<Item> tItems = template.Fields.Item;
bool[] compareArray = new bool[tItems.Count];
for (int i = 0; i < tItems.Count; i++)
{
bool compare = false;
if (tItems[i].Value != null && tItems[i].Value.Substring(0, 6) != "reqexp")
{
string value = tItems[i].Value;
foreach (var item in items)
{
compare = item.Value == tItems[i].Value;
if (compare == true)
{
compareArray[i] = compare;
break;
}
}
}
else if (tItems[i].Value != null && tItems[i].Value.Substring(0, 6) == "reqexp")
{
string value = tItems[i].Value.Substring(7);
Regex regex = new Regex(value);
foreach (var item in items)
{
Match match = regex.Match(item.Value);
compare = match.Success;
if (compare == true)
{
compareArray[i] = compare;
break;
}
}
}
else
{
string name = tItems[i].Name;
foreach (var item in items)
{
compare = item.Name == tItems[i].Name;
if (compare == true)
{
compareArray[i] = compare;
break;
}
}
}
}
bool result = compareArray.All(x => x);
return result;
}
Здесь у меня ещё идет сравнения на наличие в поле специфического маркера reqexp:
, который показывает надо ли парсит строку или нет.
Как работает: Берёт из шаблонов значение, сравнивает его со значениями в запросе. Если находит совпадение записывает 1 true
в буллинговый массив. И так по всем элементам шаблона.
В конце смотрит на буллинговый массив, если все true
- True
, если хотя бы один элемент false
- False
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Интересует, как хранить баланс пользователей в MySQL? Если во FLOAT, то он округляется и значения постоянно получаются неправильныеПробовал типы...
Тема мусолилась много еще с древних времен, когда на мамонтов ходили с копьями
How to make the calendar call by default already open as in the photo