Не могу создать регулярку на С# для парса данных из JSON

"currencies":{
   "EUR":{
   "ask":"30.0000",
   "bid":"29.5000"
 },
   "RUB":{
   "ask":"0.3860",
   "bid":"0.3680"
 },
 "USD":{
   "ask":"26.7400",
   "bid":"26.5600"
 }
} 

Нужно создать регулярку для получения данных Bid из USA. Код моей регулярки

"USD":{"...":".*?","...":"(.*?)"

Не работает. Поможете с написанием ее ? В чем ошибка ?


Ответы (1 шт):

Автор решения: Alexander Petrov

Одна из проблем разбора json регулярками состоит в том, что пробельные символы (в том числе переводы строки) могут наличествовать в любом количестве.
Проще всего полностью убрать их, опять же с помощью регулярки.
После чего можно легко распарсить.

string json = ...;
json = Regex.Replace(json, @"\s+", "");
var pattern = "\"USD\":{\"ask\":\".*?\",\"bid\":\"(.*?)\"}";
var match = Regex.Match(json, pattern);
var bid = match.Groups[1].Value;

Показанный вами код является невалидным JSON. Нужны по крайней мере ещё одни фигурные скобки. Допустим, они есть.

Вместо регулярок лучше применить какой-нибудь парсер JSON.

Например, популярную библиотеку Newtonsoft.Json. Устанавливаем её из nuget. Открываем пространство имён

using Newtonsoft.Json.Linq;

Далее достаточно следующего минимального кода:

JObject jObject = JObject.Parse(json);
var bid = jObject["currencies"]["USD"]["bid"];

Если не хочется тянуть в проект лишнюю зависимость в виде библиотеки, то можно использовать родной сериализатор дотнета - класс JavaScriptSerializer. Для этого достаточно подключить сборку System.Web.Extensions.dll.
Открываем пространство имён

using System.Web.Script.Serialization;

Далее код по сути такой же, как и выше. Но нужны приведения к типу словаря. Из-за этого код получается более громоздким.

var jss = new JavaScriptSerializer();

var jObject = (Dictionary<string, object>)jss.DeserializeObject(json);
var currencies = (Dictionary<string, object>)jObject["currencies"];
var usd = (Dictionary<string, object>)currencies["USD"];

var bid = usd["bid"];
→ Ссылка