Diskuze: JSON deserializovat do objektů
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 31 zpráv z 31.
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ten converter by mel mit metodu pro deserializaci, ktera bere jako argument string, nemusis nutne pouzit tu generickou. To by ti mohlo stacit, ne?
A mohl bys to prosím více nastínit?
našel jsem
JsonConvert.DeserializeAnonymousType(string value )
To je ono? Nevím, jak to použít.
Používal jsem doteď jen
JsonConvert.PopulateObject(response.Content, model);
var neco = JsonConvert.DeserializeObject(jsonValue);
a jak budu číst potom hodnoty z var neco?
//zkousel jsem nekolik variant, aktualne mam toto
public List<Models.GetContacts.ContactInfo> GetContactsList()
{
var client = new RestClient(Settings.UrlApi);
var request = new RestRequest("/contacts", Method.GET);
request.AddHeader("authorization", "Basic " + Settings.passwordString);
IRestResponse response = client.Execute(request);
GetContactModel getContact = new GetContactModel();
JsonConvert.PopulateObject(response.Content, getContact);
// getContact = JsonConvert.DeserializeObject(response.Content) as GetContactModel;
GetContact neco = JsonConvert.DeserializeObject<dynamic>(response.Content);
var list = neco.id;
return list;
}
public class GetContactModel
{
public GetContact contacts { get; set; }
public int total { get; set; }
}
public class GetContact
{
public List<ContactInfo> id { get; set; } //tady prostě je vždy id toho kontaktu, které neznám. Vím, že to nefunguje protože tam nemůžu napsat id. Mělo by to kopírovat strukturu.
}
public class ContactInfo
{
public int id { get; set; }
}
Takto to nejde ani zkompilovat
GetContact neco = JsonConvert.DeserializeObject<GetContactModel>(response.Content);
a pokud myslíš takto, tak to stejně nedokáže vytvořit list těch kontaktů
GetContactModelneco = JsonConvert.DeserializeObject<GetContactModel>(response.Content);
ano v ContactInfo musím dopsat i další pole, ovšem pro test to zatím stačí.
Pouzivej to tlacitko "Odpovedet", jinak nechodi notifikace!
[JsonProperty(PropertyName = "FooBar")]
public string Foo { get; set; }
V modelu, ktery slouzi pro serializaci a deserializaci pouzij vyse uvedeny atribut. Tridy maji mit jako nazev podstatne jmeno, tridni promenne a vlastnosti se pisi s prvnim pismenem velkym.
public class ContactModel
{
[JsonProperty(PropertyName = "contacts")]
public List<Contact> Contacts { get; set; }
[JsonProperty(PropertyName = "total")]
public int Total { get; set; }
}
public class Contact
{
[JsonProperty(PropertyName = "id")]
public int Id { get; set; }
// dalsi property
}
Ten "dynamic" dej do pryc a strukturu si udelej dle meho vzoru.
díky. Vím, že se to píše velkým, ale nevěděl jsem, že existuje
[JsonProperty] Super
věcička
Jenže to neřeší můj aktuální problém
Co je teda tvuj aktualni problem? Udelas si tridy dle jsonu, dle meho vzoru je zanoris, deserializujes dle typu a hotovo.
Tady je ten problém. Mám tam napsané id, jenže ono je tam místo id jen nějaké číslo. V mém JSONU úplně nahoře je to zrovna číslo 1. Ten JsonDeserializer neví, že ta jednička je vlastně id a má to deserializovat právě do toho objektu.
public class GetContact
{
[JsonProperty(PropertyName = "id")]
public List<ContactInfo> Id { get; set; }
}
Asi jsem to vyřešil. Ještě to musím nějak nacpat do listu.
public class GetContactModel
{
[JsonProperty(PropertyName = "contacts")]
public Dictionary<int, ContactInfo> Contact { get; set; }
[JsonProperty(PropertyName = "total")]
public int Total { get; set; }
}
public class ContactInfo
{
[JsonProperty(PropertyName = "id")]
public int Id { get; set; }
[JsonProperty("fields")]
public Fields Fields { get; set; }
}
public class Firstname
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("label")]
public string Label { get; set; }
[JsonProperty("alias")]
public string Alias { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("group")]
public string Group { get; set; }
[JsonProperty("value")]
public string Value { get; set; }
}
public class Fields
{
[JsonProperty("core")]
public Core Core { get; set; }
[JsonProperty("personal")]
public List<object> Personal { get; set; }
[JsonProperty("professional")]
public List<object> Professional { get; set; }
}
public class Core
{
[JsonProperty("title")]
public Firstname Title { get; set; }
[JsonProperty("firstname")]
public Firstname Firstname { get; set; }
}
var neco = JsonConvert.DeserializeObject<GetContactModel>(response.Content);
var contacts = neco.Contact.Values;
V debugu mám krásně v proměnné contacts 30 kontaktů.
Mimochodem chci doporučit https://app.quicktype.io, sice to nedokázalo vygenerovat pro mě funkční kód, ale aby člověk nemusel ručně psát ty vlastnosti objektů
Asi tu knihovnu potom zveřejním jako Open Source. Kam to potom publikovat online?
Nevím, jestli je to schválně, nebo omyl, každopádně to není správná
odpověď.
Git je verzovací systém, může běžet klidně na soukromém serveru
a použit na projekty s uzavřeným kódem.
GitHub/Lab... a pod. jsou servery, co umožňují zveřejnění
takového repozitáře online.
Poprosil bych vás prosím o zkontrolování https://github.com/…sakCZ/Mautic
Co se týče napsaného kódu, jinak funkční to je
Souhlas, ja to psal v rychlosti, tak jsem to tam placnul.
Zobrazeno 31 zpráv z 31.