Найти массив в 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" не найдено
}
→ Ссылка
Автор решения: Qwertiy

Примерно так:

(?:"(?:[^\\"]|\\.)*"|[{}\s\w,:])*\[
→ Ссылка