C# процесс JSON от ipdata.co - PullRequest
0 голосов
/ 14 января 2020

Будучи несколько новичком в C#, я надеюсь, что кто-то может помочь мне понять, что мне нужно делать.

Следующий пример является рекомендуемым C# кодом с веб-сайта документа ipdata.co.

using RestSharp; (at the top of the file)

var client = new RestClient("https://api.ipdata.co/?api-key=test");
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);

Мой ключ API работает. Я могу делать ручные запросы и получить ответ. Теперь я пытаюсь проанализировать данные JSON из переменной «response» в приведенном выше примере кода, и именно здесь я теряюсь.

  1. Я вытягиваю IP и домен имена из файла CSV

  2. Отправьте на ipdata.co и получите взамен JSON файл

  3. образец кода взят из ipdata Веб-сайт .co. Кроме того, что он показывает, я не уверен, как обработать данные, которые были возвращены в формате JSON и извлечь определенные элементы c по моему выбору, а затем записать результаты на диск.

Поиск в Google привел меня в замешательство, поэтому я надеюсь получить здесь помощь.

У меня есть файлы CSV с IP и доменными именами. Я буду запрашивать навалом, чтобы получить lat / long и ряд других переменных. Результаты я хочу проанализировать и сохранить на диск. И именно здесь я заблудился и хотел бы, чтобы кто-то не просто делал код, но помогал понять, почему мне нужно делать то, что предлагается.

Вот файл JSON, который возвращается при использовании Адрес Google 8.8.8.8.

{
"ip": "8.8.8.8",
"is_eu": false,
"city": null,
"region": null,
"region_code": null,
"country_name": "United States",
"country_code": "US",
"continent_name": "North America",
"continent_code": "NA",
"latitude": 37.751,
"longitude": -97.822,
"postal": null,
"calling_code": "1",
"flag": "https://ipdata.co/flags/us.png",
"emoji_flag": "\ud83c\uddfa\ud83c\uddf8",
"emoji_unicode": "U+1F1FA U+1F1F8",
"asn": {
    "asn": "AS15169",
    "name": "Google LLC",
    "domain": "google.com",
    "route": "8.8.8.0/24",
    "type": "hosting"
},
"languages": [
    {
        "name": "English",
        "native": "English"
    }
],
"currency": {
    "name": "US Dollar",
    "code": "USD",
    "symbol": "$",
    "native": "$",
    "plural": "US dollars"
},
"time_zone": {
    "name": "America/Chicago",
    "abbr": "CST",
    "offset": "-0600",
    "is_dst": false,
    "current_time": "2020-01-13T21:03:24.060857-06:00"
},
"threat": {
    "is_tor": false,
    "is_proxy": false,
    "is_anonymous": false,
    "is_known_attacker": false,
    "is_known_abuser": true,
    "is_threat": true,
    "is_bogon": false
},
"count": "1"
}

Если по какой-то причине неясно, о чем я спрашиваю, просто скажите мне, что мне не хватает, и я буду более чем рад добавить его. Мне нравится учиться C# но в то же время многому научиться, и я продолжаю узнавать, сколько я не знаю.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 января 2020

Чтобы получить данные, которые вы ищете, вам сначала нужно десериализовать ответ. Содержание.

Когда вы вызываете конечную точку отдыха, вы можете вызывать ее несколькими различными способами,

   var response = client.Execute(request);            // 1
   var response = client.Execute<YourClass>(request); // 2

Когда вы используете 1-й метод, вы получаете ответ, который содержит статус и контент. Вы хотите использовать статус (200), чтобы подтвердить, что вызов был успешным, а затем вы хотите использовать контент, чтобы получить необходимую информацию.

Если вы используете 1-й метод для вызова конечной точки, вам потребуется десериализовать Контент.

   var obj = JObject.Parse(response.Content);

Теперь, когда у вас есть объект, вы можете получить доступ к любым данным, используя квадратные скобки для доступа к значениям. Из вашего кода это будет выглядеть так:

   Console.WriteLine(obj["ip"].ToString());  // Prints 8.8.8.8
   Console.WriteLine(obj["time_zone"]["name"].ToString()); // Prints America/New_York

Вы можете получить доступ к другим данным аналогично этому.

Другой метод

Если вы решили использовать класс при вызове API (client.Execute<MyClass>(request)), тогда вам не нужно десериализовать. Вместо этого у вас будет response.Data как объект, который вы можете использовать для доступа к свойствам из JSON.

    Console.WriteLine(response.Data.ip); // Prints 8.8.8.8
    Console.WriteLine(response.Data.time_zone.name); // Prints America/New_York

Надеюсь, это прояснит, как получить данные из вызовов API.

Дополнительное примечание

Вы можете использовать онлайн-сайты, такие как json2csharp.com, для преобразования ваших json в C# Классы, которые можно использовать для десериализации ваших ответов.

0 голосов
/ 14 января 2020

Сначала СПАСИБО Часть кода, который я все еще пытаюсь из того, что вы опубликовали.

Это сработало, и я не мог сделать это без вашей помощи.

using System;
//Add
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using Newtonsoft.Json;
using System.Globalization;
using IpData;
using RestSharp;

namespace ipdata_co_v1
{
class Program
{
    public static void Main()
    {                   
        var client = new 
RestClient("https://api.ipdata.co/8.8.8.8?api-key=test");

        var request = new RestRequest(Method.GET);
        //IRestResponse response = client.Execute(request);

        //To get the data you are looking for, you will 
first need to deserialize the response.Content.
        //When you call the Rest endpoint, you can call it 
in a few different ways.
        //var response = client.Execute(request);            
 // 1
        var response = client.Execute<IPData>(request); // 2

        //var obj = 
JsonConvert.DeserializeObject(response.Content);

        //Console.WriteLine(obj["ip"].Value);  
        Console.WriteLine(response.Data.ip);
        Console.WriteLine(response.Data.latitude);
        Console.WriteLine(response.Data.longitude);

    }
    public class IPData
    {
        public string ip { get; set; }
        public string city { get; set; }
        public string country_name { get; set; }
        public string country_code { get; set; }
        public string continent_name { get; set; }
        public string continent_code { get; set; }
        public string latitude { get; set; }
        public string longitude { get; set; }
        public string flag { get; set; }
        public string time_zone { get; set; }
    }
 }

}

Сработало - Как только я буду больше практиковаться в этом, я хотел бы задать больше вопросов. Сначала нужно пару дней, чтобы практиковать это.

...