Как я могу прочитать все значения из этого массива массивов в JSON?

#c# #json #json.net

#c# #json #json.net

Вопрос:

Сообщество,

Я хочу прочитать все значения из этого json. Я использую C #. Как мне это сделать? Я пытаюсь использовать матрицу расстояния обслуживания openroute. Моя идея:

  string responseData = await response.Content.ReadAsStringAsync();
 var jobject = JObject.Parse(responseData);
 var onlydistance = jobject.SelectTokens("$.distances[*]")
   .Values<double>()
   .ToArray();
  

Мой JSON:

 {
    "distances": [[0, 108628.26, 2669713, 11595025], [108952.97, 0, 2674477.75, 11609762], [2688555, 2681139.5, 0, 8405009], [11596626, 11611808, 8734262, 0]],
    "destinations": [
        {
            "location": [9.700817, 48.476406],
            "snapped_distance": 118.92
        },
        {
            "location": [9.207773, 49.153882],
            "snapped_distance": 10.54
        },
        {
            "location": [37.572963, 55.801279],
            "snapped_distance": 17.45
        },
        {
            "location": [115.665017, 38.100717],
            "snapped_distance": 648.79
        }
    ],
    "sources": [
        {
            "location": [9.700817, 48.476406],
            "snapped_distance": 118.92
        },
        {
            "location": [9.207773, 49.153882],
            "snapped_distance": 10.54
        },
        {
            "location": [37.572963, 55.801279],
            "snapped_distance": 17.45
        },
        {
            "location": [115.665017, 38.100717],
            "snapped_distance": 648.79
        }
    ],
    "metadata":
    {
        "attribution": "openrouteservice.org | OpenStreetMap contributors",
        "service": "matrix",
        "timestamp": 1603348601609,
        "query":
        {
            "locations": [[9.70093, 48.477473], [9.207916, 49.153868], [37.573242, 55.801281], [115.663757, 38.106467]],
            "profile": "cycling-road",
            "responseType": "json",
            "metricsStrings": ["DISTANCE"],
            "metrics": ["distance"],
            "units": "m"
        },
        "engine":
        {
            "version": "6.3.0",
            "build_date": "2020-10-19T02:01:48Z",
            "graph_date": "2020-10-12T06:58:07Z"
        }
    }
}
  

Комментарии:

1. Я думаю, что «сохранить» — не лучшее слово. Похоже, вы хотите извлечь все значения из массивов в массиве расстояний.

2. Пожалуйста, добавьте свой JSON в вопрос в виде текста, а не в виде изображения — кстати, это не JSON.

3. Вы пробовали свою идею? это сработало? что не сработало?

4. Не могли бы вы также ответить на вопросы Лиама, пожалуйста?

5. @Йохем Ван Хеспен Ну, я прочитал ваш комментарий лишь частично: часто кто-то предлагает использовать Visual Studio Paste Special -> Paste JSON as classes . Я имел в виду этот инструмент. Я не уверен, что предложение Visual Studio Code применимо здесь.

Ответ №1:

Используйте генератор / конвертер для создания классов Json, например: https://json2csharp.com /

Пример кода:

 public Form1()
{
    InitializeComponent();

    string jsonData = File.ReadAllText(@"c:roott01.json");
    Root root  = JsonConvert.DeserializeObject<Root>(jsonData);
}

public class Root    {
    public List<List<double>> distances { get; set; } 
    public List<Destination> destinations { get; set; } 
    public List<Source> sources { get; set; } 
    public Metadata metadata { get; set; } 
}

public class Destination    {
    public List<double> location { get; set; } 
    public double snapped_distance { get; set; } 
}

public class Source    {
    public List<double> location { get; set; } 
    public double snapped_distance { get; set; } 
}

public class Query    {
    public List<List<double>> locations { get; set; } 
    public string profile { get; set; } 
    public string responseType { get; set; } 
    public List<string> metricsStrings { get; set; } 
    public List<string> metrics { get; set; } 
    public string units { get; set; } 
}

public class Engine    {
    public string version { get; set; } 
    public DateTime build_date { get; set; } 
    public DateTime graph_date { get; set; } 
}

public class Metadata    {
    public string attribution { get; set; } 
    public string service { get; set; } 
    public long timestamp { get; set; } 
    public Query query { get; set; } 
    public Engine engine { get; set; } 
}