Найти массив в json строке, если он имеется
Есть строки вида:
"{"status":"OK","error":"","region":56,"date":"2021-09-02 12:00:00","items":["2021-09-02 14:44:21"]}"
Нужно например с помощью регулярного выражения проверить, содержит ли эта строка массив, то есть содержит ли она подстроку типа:
[xxxxxxxx]
До, внутри и позади могут быть любые символы. Пытался сделать это следующим образом:
Regex regexMas = new Regex(@"^.+\[.+\].+\}.+$");
regexMas.IsMatch(str);
Ответы (2 шт):
Автор решения: aepot
→ Ссылка
Json лучше парсить специально предназначенным для этого средствами.
Я уверен, для решения вашей задачи должен быть более адекватный способ, но если действовать по хардкору, а именно реально определить, какого же именно типа данные в items, то можно пойти вот таким вот путем:
private static JsonTokenType FindItemsToken(string json)
{
var reader = new Utf8JsonReader(Encoding.UTF8.GetBytes(json));
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.PropertyName && reader.GetString() == "items")
break;
}
if (!reader.Read())
return JsonTokenType.None;
return reader.TokenType;
}
Проверяем
static void Main(string[] args)
{
string json = "{\"status\":\"OK\",\"error\":\"\",\"region\":56,\"date\":\"2021-09-02 12:00:00\",\"items\":[\"2021-09-02 14:44:21\"]}";
string json2 = "{\"status\":\"OK\",\"error\":\"\",\"region\":56,\"date\":\"2021-09-02 12:00:00\",\"items\":{\"0\":\"2021-09-02 14:44:21\"}}";
Console.WriteLine(FindItemsToken(json));
Console.WriteLine(FindItemsToken(json2));
}
Вывод в консоль
StartArray
StartObject
Использовать это просто
JsonTokenType tokenType = FindItemsToken(json);
if (tokenType == JsonTokenType.StartArray)
{
// это массив
}
else if (tokenType == JsonTokenType.StartObject)
{
// это объект
}
else
{
// это что-то другое или поле "items" не найдено
}