Не могу создать регулярку на С# для парса данных из 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 шт):
Одна из проблем разбора 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"];