Diskuze: Vytvoření konfiguráku pomocí JaSONu
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Tak jsem si to pročítal, ale pořád jsem z toho tumpachový a nevím, jak
to vytvořit.
V C# jsem pořád zatím jen pokročilý začátečník, takže hodně věcí je
pro mne pořád nových a hlavně neznámých.
Zde uvádím kod, který už mám předpřipravený a ve kterém by se to
všechno Nastavení mělo odehrávat.
Snad jsem začal dobře, nevím ...
using System;
using System.Collections.Generic;
using System.Text;
using Knihovna;
namespace Knihovna
{
class Nastaveni
{
public int Jmeno { get; }
//Dva RadioButtony (Form0)
public int Jazyk { get; }
//ComboBox - výběr jazyka a nastavení jako výchozího (Form0)
public bool Zapnuto { get; }
//CheckBox - bude zapínat (ukládat a načítat stávající nastavení) a vypínat (Form0)
public int PridatHeslo { get; }
//Tři RadioButtony (Form1)
public int VyberHesla { get; }
//ComboBox (Form1)
public int SeznamHesel { get; }
//ComboBox - přidávání hesel do CmbBoxu (Form1)
public bool Sbernice { get; }
//CheckBox (Form1)
public int Cisla { get; }
//Tři RadioButtony (Form1)
}
}
Tadeáš Burda :10.9.2020 15:59
using System;
using System.IO;
using System.Text.Json;
namespace ConsoleApp1
{
class Program
{
private class Settings
{
public string Name { get; set; }
public int Language { get; set; }
public bool IsON { get; set; }
}
static void Main(string[] args)
{
// vytvorý .json
Settings settings = new Settings()
{
Name = "ExampleName",
Language = 1,
IsON = true
};
SerializeJSON<Settings>(settings);
// načíta .json
Settings settings1 = DeserializeJSON<Settings>();
Console.WriteLine($"Settings: {settings1.Name}, {settings1.Language}, {settings1.IsON}");
Console.ReadLine();
}
static T DeserializeJSON<T>() where T : class
{
string s = File.ReadAllText("config.json");
return JsonSerializer.Deserialize<T>(s);
}
static void SerializeJSON<T>(T obj) where T : class
{
string s = JsonSerializer.Serialize<T>(obj);
File.WriteAllText("config.json", s);
}
}
}
Tadeáš Burda :10.9.2020 16:03
Joo a ešte keď máš class tak tie vlastnosti musia mať aj { set; }, inak
ti to nepôjde načítať keďže tá metoda by nemala ako vložiť tie hodnoty
do tých vlastností. Ak ti to nejde, alebo tomu nechápeš tak je to nad tvoje
sily a mal by si si prejsť ešte niake kurzy a toto skúsiť inokedy Nemáš zač
Zatím mám vytvořené - předpřipravené jen tohle: class pro výchozí
nastavení a class pro práci s nastavením.
Jinak nepoužívám Console, ale jen TextBox a RichTextBox.
using System;
using System.Collections.Generic;
using System.Text;
using Knihovna;
namespace Knihovna
{
public class VychoziNastaveni
{
public int Jmeno { get; set; }
//Dva RadioButtony (Form0) - RdbUser.Checked = true;
public int Jazyk { get; set; }
//ComboBox výběr jazyka a nastavení jako výchozího (Form0) - IcbLokalizace.SelectItem(0);
public bool Zapnuto { get; set; }
//CheckBox - bude zapínat (ukládat a načítat stávající nastavení) a vypínat (Form0) - ChbPamatovatUuzivatele.Checked = true;
public int PridatHeslo { get; set; }
//Tři RadioButtony (Form1) - RdbHeslo.Checked = true;
public int VyberHesla { get; set; }
//ComboBox (Form1) - CmbHeslo.SelectedIndex = 0;
public int SeznamHesel { get; set; }
//ComboBox - přidávání hesel do CmbBoxu (Form1)
/*CmbHeslo.Items.Add("Text1");
CmbHeslo.Items.Add("Text2");
CmbHeslo.Items.Add("Text3");
CmbHeslo.Items.Add("Text4");
CmbHeslo.Items.Add("Text5");
CmbHeslo.Items.Add("Text6");
CmbHeslo.Items.Add("Text7");*/
public bool Sbernice { get; set; }
//CheckBox (Form1) - ChbZabezpecenyPrenos.Checked = false;
public int Cisla { get; set; }
//Tři RadioButtony (Form1) - RdbObeCisla.Checked = true;
}
public class PraceSNastavenim
{
public int Jmeno { get; set; }
//Dva RadioButtony (Form0)
public int Jazyk { get; set; }
//ComboBox výběr jazyka a nastavení jako výchozího (Form0)
public bool Zapnuto { get; set; }
//CheckBox - bude zapínat (ukládat a načítat stávající nastavení) a vypínat (Form0)
public int PridatHeslo { get; set; }
//Tři RadioButtony (Form1)
public int VyberHesla { get; set; }
//ComboBox (Form1)
public bool Sbernice { get; set; }
//CheckBox (Form1)
public int Cisla { get; set; }
//Tři RadioButtony (Form1)
}
}
Daniel Semerák:10.9.2020 16:52
Tadeáš> Máš pravdu, jsem teprve na začátku a sice jsem si ty kursy
pročítal, ale stále mi to není moc jasné.
Vytvářením toho programu se zároven i učím C#.
Prostě se učím a programuji za chodu.
Sice základy už tak nějak zvládám a chápu, ale na hodně věcí bych
pořád potřeboval min. Vyšší Dívčí anebo pořádný kurs pro
začátečníky i pokročilé, ale to je zatím na mě moc drahé.
Tadeáš Burda :10.9.2020 17:00
Ok, ak ti to ide konvertovať na JSON tak good, môžeš to označiť ako
správnu odpoveď. Ako napíšeš ten program to už je natebe, alebo založ
nové vlákno možno ti niekto helpne. PS: Rob aj tie cvičenia, len čítať ti
nestačí. PS1: Aj serveri treba z niečoho platiť taký je život
Ještě řeším problém, jak propojit Nastaveni.cs s Login.cs (Form0) a s hlavním Form.cs (Form1).
Tadeáš Burda :10.9.2020 17:34
A ide ti serializovať tu triedu nastavenia?
Daniel Semerák:10.9.2020 17:59
To ještě plně neumím - nebo spíše to nechápu, ačkoli jsem si
přečetl ten návod, ale stejně tomu moc nerozumím, abych dokázal dle toho
sestavit vlastní kod.
Tadeáš Burda :10.9.2020 18:10
Dobre, tak nic... Proste: Všade kde je moja trieda "Settings" dáš tvoju "Nastavenia" a bude to fungovať. Či to je Console alebo WF to je jedno. Každopádne si myslím že to je dosť nad tvoje možnosti a mal by si sa račej ešte učiť, potom sa ktomu vráť. Alebo to skúšaj ale ja ti nemám čo poradiť.
+20 Zkušeností
+2,50 Kč

Tak nepoužívej JSON ale XML, no ono to stejně vyjde nastejno ...
XML soubor otevřeš a celej načteš do paměti a pak děláš upravy a pak ho
celej zapišeš
tady máš kompletní kod jak se to dělá, protože serializovat kompletní
třídy je strašná práce, to snad nikdo nedělá
zapisuješ jenom stav buttonů, checkboxů atd ...
konfigurační soubor na disku vypadá takhle a sestavit si ho musíš ručně
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<root>
<THID_EPSDE_M_DT_Classification>
<Reload_at_start>True</Reload_at_start>
<Write_to_RTB_enabled>False</Write_to_RTB_enabled>
<AlgorithmType>4</AlgorithmType>
<EA_useHybridOF_multiplier>50</EA_useHybridOF_multiplier>
<EA_useAutoSave>True</EA_useAutoSave>
</THID_EPSDE_M_DT_Classification>
</root>
načtení žádoucího stavu z XML souboru a nastavení korespondujících kontrols vypadá takhle
gs_R.ConfigAdmin.OpenConfigFile();
this.checkBox1.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Reload_at_start"));
this.checkBox15.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled"));
this.checkBox23.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled"));
gs_R.ConfigAdmin.OpenConfigFile();
this.checkBox1.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Reload_at_start"));
this.checkBox15.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled"));
this.checkBox23.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled"));
gs_R.ConfigAdmin.OpenConfigFile();
this.checkBox1.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Reload_at_start"));
this.checkBox15.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled"));
this.checkBox23.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled"));
gs_R.ConfigAdmin.CloseConfigFile();
zápis současného stavu controls do XML souboru vypadá takhle
gs_R.ConfigAdmin.OpenConfigFile();
gs_R.ConfigAdmin.PutStringValueByID("THID_EPSDE_M_DT_Classification", "Reload_at_start", Convert.ToString(this.checkBox1.Checked));
gs_R.ConfigAdmin.PutStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled", Convert.ToString(this.checkBox15.Checked));
gs_R.ConfigAdmin.PutStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled", Convert.ToString(this.checkBox23.Checked));
gs_R.ConfigAdmin.CloseConfigFile();
a ovládaní modul c Csharp vypadá takhle
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.ComponentModel;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Drawing;
using System.IO;
using System.Xml;
using Microsoft.Win32; // NEVER EVER USE WITH System.Core.dll !!!
namespace Test
{
public partial class ConfigAdmin
{
public static String g_Test_mainDirectory;
public static String g_registry_key;
public static String g_Test_configFile;
public static String g_Test_configFile_nameAndPath;
public static XmlDocument g_xmldoc;
static ConfigAdmin()
{
g_xmldoc = null;
g_Test_mainDirectory = "";
g_Test_configFile = "Test config file.xml";
g_registry_key = "HKEY_CURRENT_USER\\Software\\Test 1.0\\Main Folder";
}// ConfigAdmin()
//
//*********************************************
// ConfigAdmin::
public System.Boolean OpenConfigFile()
{
// OpenConfigFile( ) {
//*********************************************
if (g_xmldoc != null)
{
return false;
}// if
// registry_key = "HKEY_CURRENT_USER\\Software\\Test 1.0\\Main Folder";
if ( Microsoft.Win32.Registry.GetValue(g_registry_key, "Path", null) == null)
{
MessageBox.Show("Windows registry does not contain requested information.\n" +
"Working directory key missing: HKEY_CURRENT_USER\\Software\\Test 1.0\\Main Folder\\Path = String: ??? \n" +
"Working directory unknown.", "Config file...",
MessageBoxButtons.OK);
return false;
}//
g_Test_mainDirectory = Microsoft.Win32.Registry.GetValue(g_registry_key, "Path", "").ToString(); //
g_Test_configFile_nameAndPath = g_Test_mainDirectory + "\\" + g_Test_configFile;
if (System.IO.File.Exists(g_Test_configFile_nameAndPath) == false)
{
MessageBox.Show("ERROR: Config file does not exist !", "Config file processing...", MessageBoxButtons.OK);
return false;
}// if
FileStream fs = new FileStream(g_Test_configFile_nameAndPath, FileMode.Open, FileAccess.Read);
g_xmldoc = new XmlDocument();
g_xmldoc.Load(fs);
fs.Close();
fs = null;
return true;
}// public System.Boolean OpenConfigFile()
// ConfigAdmin::
public void CloseConfigFile()
{
// PutStringValueByID
//*********************************************
if (g_xmldoc == null)
{
return;
}// if
g_xmldoc.Save(g_Test_configFile_nameAndPath);
g_xmldoc = null;
}// System::Void ConfigAdmin::CloseConfigFile( )
// ConfigAdmin::
public System.String GetStringValueByID( String t_name, String t_ID )
{
// GetStringValueByID
XmlNodeList xmlNodeList = null;
//*********************************************
xmlNodeList = g_xmldoc.GetElementsByTagName( t_name );
if ( xmlNodeList.Count == 0 ) {
return "";
}// if
xmlNodeList = xmlNodeList[0].ChildNodes;
if ( xmlNodeList.Count == 0 ) {
return "";
}// if
for ( Int32 i = 0; i < xmlNodeList.Count; i++ ) {
if ( xmlNodeList[i].Name == t_ID ) {
return xmlNodeList[i].InnerText;
}// if
}// for i
return "";
}// public System.String GetStringValueByID
// ConfigAdmin::
public System.String PutStringValueByID( String t_name, String t_ID, String t_strValue )
{
// PutStringValueByID
//String line = "";
XmlNodeList xmlNodeList = null;
//*********************************************
xmlNodeList = g_xmldoc.GetElementsByTagName( t_name );
if ( xmlNodeList.Count == 0 ) {
return "";
}// if
xmlNodeList = xmlNodeList[0].ChildNodes;
if ( xmlNodeList.Count == 0 ) {
return "";
}// if
for ( Int32 i = 0; i < xmlNodeList.Count; i++ ) {
if ( xmlNodeList[i].Name == t_ID ) {
xmlNodeList[i].InnerText = t_strValue;
return t_strValue;
}// id
}// for i
return "";
}// PutStringValueByID( String t_name, String t_ID, String t_strValue )
}// class ConfigAdmin
}// Namespace Test
a chybička se vloudila .... načtení stavu ještě jednou
načtení žádoucího stavu z XML souboru a nastavení korespondujících
kontrols vypadá takhle
gs_R.ConfigAdmin.OpenConfigFile();
this.checkBox1.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Reload_at_start"));
this.checkBox15.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled"));
this.checkBox23.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled"));
this.checkBox15.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled"));
this.checkBox23.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled"));
gs_R.ConfigAdmin.CloseConfigFile();
Zobrazeno 17 zpráv z 17.