canovalik Ответов: 1

C# фильтрация результатов json из restclient


Я совершенно новичок в C# и не имею никакого фона в этом языке.
Единственный язык программирования, в котором я разбираюсь, - это SQL.

Моя ситуация:
У меня есть URL-адрес API с веб-сайта, который моя компания использует для мониторинга уровня продукта в резервуарах.
API возвращает json-список резервуаров (местоположение, идентификатор резервуара, размер резервуара, текущий уровень и т. д.).
Моя цель - создать приложение windows form с полем ввода.
Пользователь вводит название местоположения, нажимает кнопку и видит информацию о любых резервуарах в этом местоположении.

Что я уже пробовал:

Что я сделал до сих пор:
Опять же, у меня нет никаких знаний о программировании, поэтому не критикуйте меня, если я делал что-то очень необычным/неэффективным способом.
Мне удалось создать форму windows, которая имеет кнопку и текстовое поле.
При нажатии на кнопку текстовое поле заполняется всеми данными резервуара из API.
Я не могу понять, как фильтровать возвращенные данные.
Мой текущий код приведен ниже...
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using RestSharp;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using static APIform.Form1;

namespace APIform
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var client = new RestClient("https://{{my tank monitor website}}/admin/data_feed_configs/140.json");
            client.Timeout = -1;
            var request = new RestRequest(Method.GET);
            request.AddHeader("auth-token", "{{my token}}");
            request.AddHeader("auth-email", "{{my authorization email}}");
            request.AddHeader("Authorization", "{{my auth code}}");
            request.AddHeader("Cookie", "{{cookies}}");
            IRestResponse response = client.Execute(request);

            var data = response.Content;
            JArray jsonArray = JArray.Parse(data);

            textBox1.Text = jsonArray.ToString();
        }
    }
}


Я добавил класс модели TankClass, который напоминает текст, возвращенный из запроса.
public class TankClass
{
    public string location_name { get; set; }
    public string owner_name { get; set; }
    public string tank_id { get; set; }
    public string tank_name { get; set; }
    public string product_name { get; set; }
    public int tank_size { get; set; }
    public string sensor_value { get; set; }
    public string reading_inches { get; set; }
    public string reading_volume { get; set; }
    public string available_capacity { get; set; }
    public int fill_percentage { get; set; }
    public string fill_status { get; set; }
    public string alert_status { get; set; }
    public int days_to_empty { get; set; }
    public string battery_level { get; set; }
    public string product_sku { get; set; }
    public string reading_time { get; set; }
    public string division { get; set; }
}


Все, что я пытаюсь десериализовать/отфильтровать результаты, похоже, не работает.
Что мне нужно добавить в код, чтобы это сработало?
У меня есть второе текстовое поле (textbox2) на форме.
Здесь пользователь, например, введет "склад 1".
Когда они затем нажмут на кнопку, Я хотел бы, чтобы в поле textbox1 отображались только танки на складе 1.

С моим текущим кодом это пример того, что отображается в поле textbox1 при нажатии кнопки:
[
  {
    "location_name": "Warehouse 1",
    "owner_name": "ABC Oil, Inc.",
    "tank_id": "W00813862",
    "tank_name": "Dow - Desitherm (TEG) Tank #M-20-065",
    "product_name": "Dow - Desitherm (TEG)",
    "tank_size": 2005.0,
    "sensor_value": "2.379",
    "reading_inches": "29.6",
    "reading_volume": "908.2",
    "available_capacity": "1096.8",
    "fill_percentage": 45,
    "fill_status": "COULD",
    "alert_status": "",
    "days_to_empty": 124.4,
    "battery_level": "6.1",
    "product_sku": "",
    "reading_time": "2020-09-16T10:55:35-04:00",
    "division": "1024"
  },
  {
    "location_name": "Warehouse 2",
    "owner_name": "ABC Oil, Inc.",
    "tank_id": "Z057101",
    "tank_name": "OSI 84  - Diesel Exhaust Fluid (DEF)",
    "product_name": "Diesel Exhaust Fluid (DEF)",
    "tank_size": 8806.0,
    "sensor_value": "2554.0 | 3263.0",
    "reading_inches": "76.3",
    "reading_volume": "4868.8",
    "available_capacity": "3937.2",
    "fill_percentage": 55,
    "fill_status": "GOOD",
    "alert_status": "",
    "days_to_empty": 14.5,
    "battery_level": "-",
    "product_sku": "",
    "reading_time": "2020-09-16T10:59:00-04:00",
    "division": ""
  },
.
.
.
]

1 Ответов

Рейтинг:
4

Sandeep Mewara

Вам нужно deserialize the JSON object в определенный объект C#.

Ссылка: Как сериализовать и десериализовать JSON с помощью C# - .NET | Microsoft Docs[^]

Пример:

public class WeatherForecast
{
    public DateTimeOffset Date { get; set; }
    public int TemperatureCelsius { get; set; }
    public string Summary { get; set; }
}

// get json string from file or http response
jsonString = File.ReadAllText(fileName);
weatherForecast = JsonSerializer.Deserialize<WeatherForecast>(jsonString);

// now, use json data like a normal c# object
string summary = weatherForecast.Summary;


В вашем случае создайте класс модели для ответа JSON. Используйте этот класс в качестве типа для десериализации, а затем используйте его.