Динамически перебирать объект JSON - PullRequest
0 голосов
/ 13 октября 2019

У меня есть эта строка JSON:

{
  "time": {
    "updated": "Oct 13, 2019 11:42:00 UTC",
    "updatedISO": "2019-10-13T11:42:00+00:00",
    "updateduk": "Oct 13, 2019 at 12:42 BST"
  },
  "disclaimer": "This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchangerates.org",
  "chartName": "Bitcoin",
  "bpi": {
    "USD": {
      "code": "USD",
      "symbol": "$",
      "rate": "8,392.9583",
      "description": "United States Dollar",
      "rate_float": 8392.9583
    },
    "GBP": {
      "code": "GBP",
      "symbol": "£",
      "rate": "6,634.7343",
      "description": "British Pound Sterling",
      "rate_float": 6634.7343
    },
    "EUR": {
      "code": "EUR",
      "symbol": "€",
      "rate": "7,605.7660",
      "description": "Euro",
      "rate_float": 7605.766
    }
  }
}

Я хотел бы сделать что-то вроде этого:

var bpi = JsonConvert.DeserializeObject<dynamic>(json)["bpi"];

foreach (var currency in bpi)
{
   // Do something with currency["rate"] for example
}

Проблема в том, что currency представляет объект JSON, но не егосодержание. Как я могу это сделать?

Я искал по сети и ничего не нашел, я также пытался привести currency к JObject, но это ничего не изменило.

Ответы [ 4 ]

0 голосов
/ 13 октября 2019
using Newtonsoft.Json.Linq;

(...)

JObject o = JObject.Parse(json);

var bpis = o["bpi"];
foreach( var bpi in bpis ) {
  Console.WriteLine(bpi);
}

Вывод:

"USD": {
  "code": "USD",
  "symbol": "&#36;",
  "rate": "8,392.9583",
  "description": "United States Dollar",
  "rate_float": 8392.9583
}
"GBP": {
  "code": "GBP",
  "symbol": "&pound;",
  "rate": "6,634.7343",
  "description": "British Pound Sterling",
  "rate_float": 6634.7343
}
"EUR": {
  "code": "EUR",
  "symbol": "&euro;",
  "rate": "7,605.7660",
  "description": "Euro",
  "rate_float": 7605.766
}

Больше примеров на https://www.newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm

0 голосов
/ 13 октября 2019

Вам необходимо получить доступ к свойству Value возвращаемого объекта.

foreach (var bpis in JsonConvert.DeserializeObject<dynamic>(j)["bpi"])
{
    Console.WriteLine(bpis.Value["rate"].Value);
    Console.WriteLine(bpis.Value["code"].Value);
}
0 голосов
/ 13 октября 2019

Проблема, с которой вы столкнулись, состоит в том, что члены bpi являются экземплярами JProperty - у них есть имя и значение. значение свойства - это объект с интересующими вас данными, а не само свойство .

Вместо вашего комментария

// Do something with currency["rate"] for example

вместо этого сделайте что-то вроде

Console.WriteLine(currency.Value["rate"]);

0 голосов
/ 13 октября 2019

Вы можете использовать JArray и JObject классы из Newtonsoft.Json для достижения этой цели.

Не 100% соответствия, но показывает, как получить образцы здесь: https://www.newtonsoft.com/json/help/html/ToObjectComplex.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...