Пробую изучать C# нужна подсказка или помощ
Цитата: t4k от 03.03.2023, 00:33Ещё модель можно быстро получить при помощи Visual Studio, если выбрать в меню "правка -> специальная вставка -> вставить JSON как классы"
И рекомендую посмотреть что такое атрибут [JsonPropertyName]. Потому что у JSON свой стандарт именования переменных, а у C# свой.
Ещё модель можно быстро получить при помощи Visual Studio, если выбрать в меню "правка -> специальная вставка -> вставить JSON как классы"
И рекомендую посмотреть что такое атрибут [JsonPropertyName]. Потому что у JSON свой стандарт именования переменных, а у C# свой.
Цитата: Aleksey от 05.03.2023, 03:14Всем привет
Дошёл до видео о работе с json через сериализацию/десериализацию.
[spoiler title="там есть такой код"]string json = new WebClient().DownloadString("http://free.ipwhois.io/json/23.76.76.25?lang=ru"); var d = new JavaScriptSerializer().Deserialize<dynamic>(json); label1.Text = d["city"];Студия ругается, на: скобки [ ] , Ошибка CS0021 Не удается применить индексирование через [] к выражению типа "object".
Директивы все добавил.
Всем привет
Дошёл до видео о работе с json через сериализацию/десериализацию.
string json = new WebClient().DownloadString("http://free.ipwhois.io/json/23.76.76.25?lang=ru");
var d = new JavaScriptSerializer().Deserialize<dynamic>(json);
label1.Text = d["city"];
Студия ругается, на: скобки [ ] , Ошибка CS0021 Не удается применить индексирование через [] к выражению типа "object".
Директивы все добавил.
Цитата: Mikhail от 05.03.2023, 03:25Привет.
А такlabel1.Text = d.GetValue("city").ToString();?
Привет.
А так Скопированоlabel1.Text = d.GetValue("city").ToString();?
Цитата: Mikhail от 05.03.2023, 03:45Упс, точно.
Может простоlabel1.Text = d.city;, на сколько помню, тип dynamic вроде не поддерживает доступ через оператор [ ], но это не точно.
Еще может быть такое, что строки с сервера получаются не правильно, но это вряд ли конечно.
Упс, точно.
Может просто Скопированоlabel1.Text = d.city;, на сколько помню, тип dynamic вроде не поддерживает доступ через оператор [ ], но это не точно.
Еще может быть такое, что строки с сервера получаются не правильно, но это вряд ли конечно.
Цитата: Aleksey от 05.03.2023, 03:53нееее
label1.Text = d.city; это точно не вариант.
[spoiler title=""] dynamic - это динамический объект который может меняться по ходу программирования [/spoiler]
я уже пробовал по разному, но пока никак.
label1.Text = d["city"].ToString(); и label1.Text = d("city"); и label1.Text = d[city] ; разные варианты.
нееее
label1.Text = d.city; это точно не вариант.
я уже пробовал по разному, но пока никак.
label1.Text = d["city"].ToString(); и label1.Text = d("city"); и label1.Text = d[city] ; разные варианты.
Цитата: Adler от 05.03.2023, 07:06Десериализуйте как конкретный класс
[spoiler title=""]public class IPInfo { public string ip { get; set; } public bool success { get; set; } public string type { get; set; } public string continent { get; set; } public string continent_code { get; set; } public string country { get; set; } public string country_code { get; set; } public string country_flag { get; set; } public string country_capital { get; set; } public string country_phone { get; set; } public string country_neighbours { get; set; } public string region { get; set; } public string city { get; set; } public double latitude { get; set; } public double longitude { get; set; } public string asn { get; set; } public string org { get; set; } public string isp { get; set; } public string timezone { get; set; } public string timezone_name { get; set; } public int timezone_dstOffset { get; set; } public int timezone_gmtOffset { get; set; } public string timezone_gmt { get; set; } public string currency { get; set; } public string currency_code { get; set; } public string currency_symbol { get; set; } public double currency_rates { get; set; } public string currency_plural { get; set; } }[/spoiler]
и работайте с ним.
Если вам не нужны все значения, то можете составить класс только с нужными, а при десериализации остальные просто проигнорируются.
Десериализуйте как конкретный класс
public class IPInfo
{
public string ip { get; set; }
public bool success { get; set; }
public string type { get; set; }
public string continent { get; set; }
public string continent_code { get; set; }
public string country { get; set; }
public string country_code { get; set; }
public string country_flag { get; set; }
public string country_capital { get; set; }
public string country_phone { get; set; }
public string country_neighbours { get; set; }
public string region { get; set; }
public string city { get; set; }
public double latitude { get; set; }
public double longitude { get; set; }
public string asn { get; set; }
public string org { get; set; }
public string isp { get; set; }
public string timezone { get; set; }
public string timezone_name { get; set; }
public int timezone_dstOffset { get; set; }
public int timezone_gmtOffset { get; set; }
public string timezone_gmt { get; set; }
public string currency { get; set; }
public string currency_code { get; set; }
public string currency_symbol { get; set; }
public double currency_rates { get; set; }
public string currency_plural { get; set; }
}
и работайте с ним.
Если вам не нужны все значения, то можете составить класс только с нужными, а при десериализации остальные просто проигнорируются.
Цитата: Aleksey от 05.03.2023, 15:51ПриветствуюAdler,
Вы бы могли мне пояснить на живом примере, как правильно написать код, или где я допускаю ошибки в своём коде?
[spoiler title=""]using Nancy.Json; using Newtonsoft.Json; using System; using System.Net; using System.Windows.Forms; namespace FileSerch { public class JsonClass { public string ip { get; set; } public bool success { get; set; } public string type { get; set; } public string continent { get; set; } public string continent_code { get; set; } public string country { get; set; } public string country_code { get; set; } public string country_flag { get; set; } public string country_capital { get; set; } public string country_phone { get; set; } public string country_neighbours { get; set; } public string region { get; set; } public string city { get; set; } public double latitude { get; set; } public double longitude { get; set; } public string asn { get; set; } public string org { get; set; } public string isp { get; set; } public string timezone { get; set; } public string timezone_name { get; set; } public int timezone_dstOffset { get; set; } public int timezone_gmtOffset { get; set; } public string timezone_gmt { get; set; } public string currency { get; set; } public string currency_code { get; set; } public string currency_symbol { get; set; } public double currency_rates { get; set; } public string currency_plural { get; set; } } public partial class Form1 : Form { public Form1() { InitializeComponent(); } void button1_Click(object sender, EventArgs e) { JsonClass myJsonClass = JsonConvert.DeserializeObject<JsonClass>($"http://ipwho.is/8.8.4.4"); label1.Text = string.Join(Environment.NewLine, myJsonClass); // string json = new WebClient().DownloadString("http://free.ipwhois.io/json/23.76.76.25?lang=ru"); // var d = new JavaScriptSerializer().Deserialize<dynamic>(json); // label1.Text = d["city"]; } } }
[/spoiler]
Если я правильно понимаю, то мы добавляем директивы нужные (using Nancy.Json; using Newtonsoft.Json; using System; using System.Net; using System.Windows.Forms;), затем добавляем класс в котором есть все нам необходимые параметры из ссылки "http://ipwho.is/8.8.4.4" , а потом на кнопку button1 мы пишем инструкцию:
JsonClass myJsonClass = JsonConvert.DeserializeObject<JsonClass>($"http://ipwho.is/8.8.4.4"); // тут мы в переменную myJsonClass сохраняем данные с сайта
label1.Text = string.Join(Environment.NewLine, myJsonClass); // тут мы выводим в label1 все данные из нашей переменной myJsonClassя правильно понимаю? и почему этот код не работает?
А так же, как мне вывести например в label1 не все параметры с сайта, а например нужные мне ? пример: label1.Text = myJsonClass("timezone","city", "country")
Прошу пояснить мне на примере моём (до меня так лучше доходит, на примере).
Спасибо
ПриветствуюAdler,
Вы бы могли мне пояснить на живом примере, как правильно написать код, или где я допускаю ошибки в своём коде?
using Nancy.Json;
using Newtonsoft.Json;
using System;
using System.Net;
using System.Windows.Forms;
namespace FileSerch
{
public class JsonClass
{
public string ip { get; set; }
public bool success { get; set; }
public string type { get; set; }
public string continent { get; set; }
public string continent_code { get; set; }
public string country { get; set; }
public string country_code { get; set; }
public string country_flag { get; set; }
public string country_capital { get; set; }
public string country_phone { get; set; }
public string country_neighbours { get; set; }
public string region { get; set; }
public string city { get; set; }
public double latitude { get; set; }
public double longitude { get; set; }
public string asn { get; set; }
public string org { get; set; }
public string isp { get; set; }
public string timezone { get; set; }
public string timezone_name { get; set; }
public int timezone_dstOffset { get; set; }
public int timezone_gmtOffset { get; set; }
public string timezone_gmt { get; set; }
public string currency { get; set; }
public string currency_code { get; set; }
public string currency_symbol { get; set; }
public double currency_rates { get; set; }
public string currency_plural { get; set; }
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
void button1_Click(object sender, EventArgs e)
{
JsonClass myJsonClass = JsonConvert.DeserializeObject<JsonClass>($"http://ipwho.is/8.8.4.4");
label1.Text = string.Join(Environment.NewLine, myJsonClass);
// string json = new WebClient().DownloadString("http://free.ipwhois.io/json/23.76.76.25?lang=ru");
// var d = new JavaScriptSerializer().Deserialize<dynamic>(json);
// label1.Text = d["city"];
}
}
}
Если я правильно понимаю, то мы добавляем директивы нужные (using Nancy.Json; using Newtonsoft.Json; using System; using System.Net; using System.Windows.Forms;), затем добавляем класс в котором есть все нам необходимые параметры из ссылки "http://ipwho.is/8.8.4.4" , а потом на кнопку button1 мы пишем инструкцию:
JsonClass myJsonClass = JsonConvert.DeserializeObject<JsonClass>($"http://ipwho.is/8.8.4.4"); // тут мы в переменную myJsonClass сохраняем данные с сайта
label1.Text = string.Join(Environment.NewLine, myJsonClass); // тут мы выводим в label1 все данные из нашей переменной myJsonClass
я правильно понимаю? и почему этот код не работает?
А так же, как мне вывести например в label1 не все параметры с сайта, а например нужные мне ? пример: label1.Text = myJsonClass("timezone","city", "country")
Прошу пояснить мне на примере моём (до меня так лучше доходит, на примере).
Спасибо
Цитата: Aleksey от 05.03.2023, 16:42Если код написать так:
[spoiler title=""]using Nancy.Json; using Newtonsoft.Json; using System; using System.Net; using System.Windows.Forms; namespace FileSerch { public class JsonClass { public string ip { get; set; } public bool success { get; set; } public string type { get; set; } public string continent { get; set; } public string continent_code { get; set; } public string country { get; set; } public string country_code { get; set; } public string country_flag { get; set; } public string country_capital { get; set; } public string country_phone { get; set; } public string country_neighbours { get; set; } public string region { get; set; } public string city { get; set; } public double latitude { get; set; } public double longitude { get; set; } public string asn { get; set; } public string org { get; set; } public string isp { get; set; } public string timezone { get; set; } public string timezone_name { get; set; } public int timezone_dstOffset { get; set; } public int timezone_gmtOffset { get; set; } public string timezone_gmt { get; set; } public string currency { get; set; } public string currency_code { get; set; } public string currency_symbol { get; set; } public double currency_rates { get; set; } public string currency_plural { get; set; } } public partial class Form1 : Form { public Form1() { InitializeComponent(); } void button1_Click(object sender, EventArgs e) { string json = new WebClient().DownloadString("http://ipwho.is/8.8.4.4"); var d = new JavaScriptSerializer().Deserialize<dynamic>(json); label1.Text = d["city"]; // label1.Text = d["city"]["country"]["timezone"]; // label1.Text = d["city", "country", "timezone"]; } } }
[/spoiler]
то, программа работает, и выдаёт нам один запрос "city" .
если я хочу вывести несколько данных в label1, то не хочет, как вывести несколько данных, то что указать ей? пробовал разные варианты.
label1.Text = d["city"]["country"]["timezone"];
label1.Text = d["city", "country", "timezone"];
Если код написать так:
using Nancy.Json;
using Newtonsoft.Json;
using System;
using System.Net;
using System.Windows.Forms;
namespace FileSerch
{
public class JsonClass
{
public string ip { get; set; }
public bool success { get; set; }
public string type { get; set; }
public string continent { get; set; }
public string continent_code { get; set; }
public string country { get; set; }
public string country_code { get; set; }
public string country_flag { get; set; }
public string country_capital { get; set; }
public string country_phone { get; set; }
public string country_neighbours { get; set; }
public string region { get; set; }
public string city { get; set; }
public double latitude { get; set; }
public double longitude { get; set; }
public string asn { get; set; }
public string org { get; set; }
public string isp { get; set; }
public string timezone { get; set; }
public string timezone_name { get; set; }
public int timezone_dstOffset { get; set; }
public int timezone_gmtOffset { get; set; }
public string timezone_gmt { get; set; }
public string currency { get; set; }
public string currency_code { get; set; }
public string currency_symbol { get; set; }
public double currency_rates { get; set; }
public string currency_plural { get; set; }
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
void button1_Click(object sender, EventArgs e)
{
string json = new WebClient().DownloadString("http://ipwho.is/8.8.4.4");
var d = new JavaScriptSerializer().Deserialize<dynamic>(json);
label1.Text = d["city"];
// label1.Text = d["city"]["country"]["timezone"];
// label1.Text = d["city", "country", "timezone"];
}
}
}
то, программа работает, и выдаёт нам один запрос "city" .
если я хочу вывести несколько данных в label1, то не хочет, как вывести несколько данных, то что указать ей? пробовал разные варианты.
label1.Text = d["city"]["country"]["timezone"];
label1.Text = d["city", "country", "timezone"];
Цитата: Aleksey от 05.03.2023, 22:47Всем привет
Есть вопрос по уроку (Следим за файловой системой – FileSystemWatcher)
То ли баг у меня, то ли я не разобрался, и где-то допустил ошибку не пойму. Если у кого-то получилось, подскажите в чём это дело?
т.е. на создание файла, мне пишет "Фаил 1.txt переименован" , вместо создан.
[spoiler title="код программы"]using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Whatcher { public partial class Form1 : Form { void Watcher_Created(object s, FileSystemEventArgs e) => label1.Text += $"Файл 1.txt создан {DateTime.Now}\n"; void Watcher_Deleted(object s, FileSystemEventArgs e) => label1.Text += $"Файл 1.txt удалён {DateTime.Now}\n"; void Watcher_Renamed(object s, FileSystemEventArgs e) => label1.Text += $"Файл 1.txt переименован {DateTime.Now}\n"; public Form1() { InitializeComponent(); } void Form1_Load(object sender, EventArgs e) { FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Users\virus\Desktop", "1.txt"); watcher.EnableRaisingEvents = true; watcher.SynchronizingObject = this; watcher.Created += new FileSystemEventHandler(Watcher_Created); watcher.Deleted += new FileSystemEventHandler(Watcher_Deleted); watcher.Renamed += new RenamedEventHandler(Watcher_Renamed); } } }
[/spoiler]
видео моё как работает программа.
мой проект
Всем привет
Есть вопрос по уроку (Следим за файловой системой – FileSystemWatcher)
То ли баг у меня, то ли я не разобрался, и где-то допустил ошибку не пойму. Если у кого-то получилось, подскажите в чём это дело?
т.е. на создание файла, мне пишет "Фаил 1.txt переименован" , вместо создан.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Whatcher
{
public partial class Form1 : Form
{
void Watcher_Created(object s, FileSystemEventArgs e) => label1.Text += $"Файл 1.txt создан {DateTime.Now}\n";
void Watcher_Deleted(object s, FileSystemEventArgs e) => label1.Text += $"Файл 1.txt удалён {DateTime.Now}\n";
void Watcher_Renamed(object s, FileSystemEventArgs e) => label1.Text += $"Файл 1.txt переименован {DateTime.Now}\n";
public Form1()
{
InitializeComponent();
}
void Form1_Load(object sender, EventArgs e)
{
FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Users\virus\Desktop", "1.txt");
watcher.EnableRaisingEvents = true;
watcher.SynchronizingObject = this;
watcher.Created += new FileSystemEventHandler(Watcher_Created);
watcher.Deleted += new FileSystemEventHandler(Watcher_Deleted);
watcher.Renamed += new RenamedEventHandler(Watcher_Renamed);
}
}
}
видео моё как работает программа.
мой проект
Цитата: yuri от 06.03.2023, 00:07Aleksey, привет,
json- это тип данных, который имеет такую структуру. Однако, у Тебя это строка, поэтомуdопределяется в формат словаря. Чтобы Тебе получить несколько значений можно сделать цикл, который Тебе склеит несколько значений в одно, либо склеивать вручную через+[spoiler title="Пример цикла"]
string json = new WebClient().DownloadString("http://ipwho.is/8.8.4.4"); var d = new JavaScriptSerializer().Deserialize<dynamic>(json); string[] whatsNeed = { "ip", "city", "country", }; string result = ""; foreach (string what in whatsNeed) { if (d.ContainsKey(what)) // если ключ есть, то добавлем значение к строке result += d[what] + "\n"; }Однако, у этого способа есть небольшой недостаток:
System.Collections.Generic.Dictionary`2[System.String,System.Object]
Вот, что произойдет, если попробовать получить значение с помощью ключаflag, потому что он хранит в Себе еще один словарь.
Чтобы получить значение из словаря в словаре, можно сделать так:
d["flag"]["emoji"][/spoiler]
Через
+
string result = d["city"] + d["country"] + d["flag"]["emoji"];Также, можно увидеть полноценный ответ от сервера в качестве файла:
File.WriteAllText(@"C:\путь\к\файлу.тхт", json);
И там посмотреть какие ключи есть
Aleksey, привет, Скопированоjson - это тип данных, который имеет такую структуру. Однако, у Тебя это строка, поэтому Скопированоd определяется в формат словаря. Чтобы Тебе получить несколько значений можно сделать цикл, который Тебе склеит несколько значений в одно, либо склеивать вручную через Скопировано+
string json = new WebClient().DownloadString("http://ipwho.is/8.8.4.4");
var d = new JavaScriptSerializer().Deserialize<dynamic>(json);
string[] whatsNeed = {
"ip",
"city",
"country",
};
string result = "";
foreach (string what in whatsNeed) {
if (d.ContainsKey(what)) // если ключ есть, то добавлем значение к строке
result += d[what] + "\n";
}
Однако, у этого способа есть небольшой недостаток:
СкопированоSystem.Collections.Generic.Dictionary`2[System.String,System.Object]
Вот, что произойдет, если попробовать получить значение с помощью ключа Скопированоflag, потому что он хранит в Себе еще один словарь.
Чтобы получить значение из словаря в словаре, можно сделать так:
Скопированоd["flag"]["emoji"]
Через Скопировано+
Скопированоstring result = d["city"] + d["country"] + d["flag"]["emoji"];
Также, можно увидеть полноценный ответ от сервера в качестве файла:
СкопированоFile.WriteAllText(@"C:\путь\к\файлу.тхт", json);
И там посмотреть какие ключи есть
Цитата: yuri от 06.03.2023, 00:22Пишет, что файл переименован, потому что когда Ты создаешь файл у него уже есть название
Новый текстовый документ.txt, поэтому Ты переименовываешь уже созданный файл в1.txt(именно за ним Ты и следишь), если Ты создашь файл с таким названием, например через c#, то все будет отображаться корректно
Пишет, что файл переименован, потому что когда Ты создаешь файл у него уже есть название СкопированоНовый текстовый документ.txt, поэтому Ты переименовываешь уже созданный файл в Скопировано1.txt (именно за ним Ты и следишь), если Ты создашь файл с таким названием, например через c#, то все будет отображаться корректно