Получить все значения из JObject и сохранить его в список c# - PullRequest
0 голосов
/ 28 марта 2020

У меня ниже json строка, которую я преобразовал в JObject.

Я хочу получить значения из этого JObject и вставить в List, чтобы я мог вставить эти данные в SQL для последующего использования.

json данные -

{
    "Meta Data": {
        "1. Information": "Intraday (5min) open, high, low, close prices and volume",
    },
    "Time Series (5min)": {
        "2020-03-26 16:00:00": {
            "1. open": "156.2200",
            "2. high": "156.7400",
            "3. low": "154.6100",
            "4. close": "155.9500",
            "5. volume": "4185884"
        },
        "2020-03-26 15:55:00": {
            "1. open": "152.5700",
            "2. high": "156.2500",
            "3. low": "152.5700",
            "4. close": "156.2400",
            "5. volume": "2648305"
        }
    }
}

c# код -

    HttpClient _client = new HttpClient();
    var result = _client.GetAsync("https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=5min&apikey=demo").Result;
    var data = result.Content.ReadAsStringAsync().Result;

    JObject json = JObject.Parse(data);

    var timeSeries = JObject.Parse(data)["Time Series (5min)"];

Я хочу убрать все значения, как показано ниже, так что в SQL таблица i могу вставить его как -

Date                | Position   | Value

2020-03-26 16:00:00 |  1. open   | 156.2200
2020-03-26 16:00:00 |  2. high   | 156.7400
2020-03-26 16:00:00 |  3. low    | 154.6100
2020-03-26 16:00:00 |  4. close  | 155.9500
2020-03-26 16:00:00 |  5. volume | 4185884
2020-03-26 15:55:00 |  1. open   | 152.5700
2020-03-26 15:55:00 |  2. high   | 156.2500
2020-03-26 15:55:00 |  3. low    | 152.5700
2020-03-26 15:55:00 |  4. close  | 156.2400
2020-03-26 15:55:00 |  5. volume | 2648305

Я не нахожу [] в выводе json, поэтому не уверен, как пройти и получить данные.

Ответы [ 3 ]

2 голосов
/ 28 марта 2020

Чуть более краткое выражение LINQ для вашего рассмотрения:

var timeSeries = JObject.Parse(data)["Time Series (5min)"].Cast<JProperty>();
var result = timeSeries.SelectMany(ts => (ts.Value as JObject).Properties(), (obj, props) => new {Date = obj.Name, Position = props.Name, props.Value });

Практически та же самая вложенная итерация на JProperties вплоть до уровня Value

2 голосов
/ 28 марта 2020

Вы не можете получить доступ к токену Time Series (5min) с помощью индексатора [], потому что это не массив. Попробуйте привести его к JObject и перечислить его Properties(), чтобы получить ожидаемый результат, который можно легко разбить на список кортежей или другой тип

var json = JObject.Parse(data);

var timeSeries = new List<Item>();
var series = (JObject)json["Time Series (5min)"];
foreach (var serie in series.Properties())
{
    var items = (JObject)serie.Value;
    timeSeries.AddRange(items.Properties()
        .Select(item => new Item
        {
            Date = serie.Name, Position = item.Name, Value = item.Value.Value<double>()
        }));
}

Item класс для справки

public class Item
{
    public string Date { get; set; }

    public string Position { get; set; }

    public double Value { get; set; }
}
1 голос
/ 28 марта 2020

Получив свойства и приведя их к JObject по мере необходимости, вы можете получить желаемый результат:

        JObject json = JObject.Parse(data);

        foreach (JProperty dateTime in json["Time Series (5min)"])
        {
            foreach (JProperty property in (dateTime.Value as JObject).Properties())
            {
                Console.WriteLine("{0,-24}{1,-16}{2,-16}", dateTime.Name, property.Name, property.Value);
            }
        }

Вот вывод:

2020-03-26 16:00:00     1. open         156.2200
2020-03-26 16:00:00     2. high         156.7400
2020-03-26 16:00:00     3. low          154.6100
2020-03-26 16:00:00     4. close        155.9500
2020-03-26 16:00:00     5. volume       4185884
2020-03-26 15:55:00     1. open         152.5700
2020-03-26 15:55:00     2. high         156.2500
2020-03-26 15:55:00     3. low          152.5700
2020-03-26 15:55:00     4. close        156.2400
2020-03-26 15:55:00     5. volume       2648305
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...