Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Swiftu. Zároveň využij výhodnou slevovou akci až 30 % zdarma při nákupu e-learningu - více informací.
discount 30 + hiring

Diskuze: JSON deserializovat do objektů

Aktivity
Avatar
Adam Gajdečka:2.4.2018 12:49

Mám takový dlouhodobý problém. Potřebuji JSON deserializovat do objektů v C#.

{
    "total": "1",
    "contacts": {
        "1": {
            "id": 47,
            "isPublished": true,
            "dateAdded": "2015-07-21T12:27:12-05:00",
            "createdBy": 1,
            "createdByUser": "Joe Smith",
            "dateModified": "2015-07-21T14:12:03-05:00",
            "modifiedBy": 1,
            "modifiedByUser": "Joe Smith",
            "owner": {
                "id": 1,
                "username": "joesmith",
                "firstName": "Joe",
                "lastName": "Smith"
            },
            "points": 10,
            "lastActive": "2015-07-21T14:19:37-05:00",
            "dateIdentified": "2015-07-21T12:27:12-05:00",
            "color": "ab5959",
            "ipAddresses": {
                "111.111.111.111": {
                    "ipAddress": "111.111.111.111",
                    "ipDetails": {
                        "city": "",
                        "region": "",
                        "country": "",
                        "latitude": "",
                        "longitude": "",
                        "isp": "",
                        "organization": "",
                        "timezone": ""
                    }
                }
            },
            "fields": {
                "core": {
                    "title": {
                        "id": "1",
                        "label": "Title",
                        "alias": "title",
                        "type": "lookup",
                        "group": "core",
                        "value": "Mr"
                    },
                    "firstname": {
                        "id": "2",
                        "label": "First Name",
                        "alias": "firstname",
                        "type": "text",
                        "group": "core",
                        "value": "Jim"
                    },

                    "...": {
                        "..." : "..."
                    }
                },
                "social": {
                    "twitter": {
                        "id": "17",
                        "label": "Twitter",
                        "alias": "twitter",
                        "type": "text",
                        "group": "social",
                        "value": "jimcontact"
                    },

                    "...": {
                        "..." : "..."
                    }
                },
                "personal": [],
                "professional": [],
                "all": {
                    "title": "Mr",
                    "firstname": "Jim",
                    "twitter": "jimcontact",

                    "...": "..."
                }
            }
        }
    }
}

Problém je v tom, že v poli Contacts je označen kontakt podle Id. Tedy variabilního čísla. Normálně bych vytvořil objekty kopírující strukturu JSONu. Ale co s tím, když se mi mění název té proměnné?

Díky

Potřebuji použít https://www.newtonsoft.com/json

 
Odpovědět
2.4.2018 12:49
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Adam Gajdečka
vajkuba1234:2.4.2018 13:21

Ten converter by mel mit metodu pro deserializaci, ktera bere jako argument string, nemusis nutne pouzit tu generickou. To by ti mohlo stacit, ne?

Nahoru Odpovědět
2.4.2018 13:21
No hope, no future, JUST WAR!
Avatar
Adam Gajdečka:2.4.2018 13:24

A mohl bys to prosím více nastínit?

 
Nahoru Odpovědět
2.4.2018 13:24
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Adam Gajdečka
vajkuba1234:2.4.2018 13:28

Vyzkousel jsi to?

Nahoru Odpovědět
2.4.2018 13:28
No hope, no future, JUST WAR!
Avatar
Adam Gajdečka:2.4.2018 13:30

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);
 
Nahoru Odpovědět
2.4.2018 13:30
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Adam Gajdečka
vajkuba1234:2.4.2018 13:42
var neco = JsonConvert.DeserializeObject(jsonValue);
Nahoru Odpovědět
2.4.2018 13:42
No hope, no future, JUST WAR!
Avatar
Adam Gajdečka:2.4.2018 13:45

a jak budu číst potom hodnoty z var neco?

 
Nahoru Odpovědět
2.4.2018 13:45
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Adam Gajdečka
vajkuba1234:2.4.2018 13:48

Co to treba vyzkouset a projet si to v debugu?

Nahoru Odpovědět
2.4.2018 13:48
No hope, no future, JUST WAR!
Avatar
Adam Gajdečka:2.4.2018 13:51

ve var neco je null :-(

 
Nahoru Odpovědět
2.4.2018 13:51
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Adam Gajdečka
vajkuba1234:2.4.2018 14:44

Pouzivej odpovedet, ukaz tvuj kod.

Nahoru Odpovědět
2.4.2018 14:44
No hope, no future, JUST WAR!
Avatar
Adam Gajdečka:2.4.2018 16:57

//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; }
   }
 
Nahoru Odpovědět
2.4.2018 16:57
Avatar
jozef_i
Člen
Avatar
jozef_i:2.4.2018 17:28

Namiesto typu "dynamic" tam treba dať triedu GetContactModel, ale trieda ContactInfo by mala asi obsahovať aj ostatné polia , ktoré sú v Json stringu...

 
Nahoru Odpovědět
2.4.2018 17:28
Avatar
Adam Gajdečka:2.4.2018 18:05

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čí.

 
Nahoru Odpovědět
2.4.2018 18:05
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Adam Gajdečka
vajkuba1234:2.4.2018 18:44

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.

Nahoru Odpovědět
2.4.2018 18:44
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Adam Gajdečka:2.4.2018 19:08

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

 
Nahoru Odpovědět
2.4.2018 19:08
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Adam Gajdečka
vajkuba1234:2.4.2018 20:13

Co je teda tvuj aktualni problem? Udelas si tridy dle jsonu, dle meho vzoru je zanoris, deserializujes dle typu a hotovo.

Nahoru Odpovědět
2.4.2018 20:13
No hope, no future, JUST WAR!
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Adam Gajdečka:2.4.2018 20:18

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; }

  }
 
Nahoru Odpovědět
2.4.2018 20:18
Avatar
Odpovídá na vajkuba1234
Adam Gajdečka:2.4.2018 20:18

je potřeba to nějak adekvátně upravit

 
Nahoru Odpovědět
2.4.2018 20:18
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Adam Gajdečka
vajkuba1234:2.4.2018 20:22

Co to je za api? Dej link

Nahoru Odpovědět
2.4.2018 20:22
No hope, no future, JUST WAR!
Avatar
Adam Gajdečka:2.4.2018 22:08

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ů.

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
2.4.2018 22:08
Avatar
Adam Gajdečka:2.4.2018 22:27

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ů

 
Nahoru Odpovědět
2.4.2018 22:27
Avatar
Odpovídá na vajkuba1234
Adam Gajdečka:3.4.2018 20:26

Asi tu knihovnu potom zveřejním jako Open Source. Kam to potom publikovat online?

 
Nahoru Odpovědět
3.4.2018 20:26
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Adam Gajdečka
vajkuba1234:3.4.2018 20:30

Jakou knihovnu?

Nahoru Odpovědět
3.4.2018 20:30
No hope, no future, JUST WAR!
Avatar
Odpovídá na vajkuba1234
Adam Gajdečka:3.4.2018 20:32

no dělám knihovnu napojení na to API Mauticu

 
Nahoru Odpovědět
3.4.2018 20:32
Avatar
vajkuba1234
Člen
Avatar
Nahoru Odpovědět
3.4.2018 20:55
No hope, no future, JUST WAR!
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na vajkuba1234
Petr Čech:4.4.2018 22:24

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.

Nahoru Odpovědět
4.4.2018 22:24
the cake is a lie
Avatar
Adam Gajdečka:4.4.2018 22:41

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

 
Nahoru Odpovědět
4.4.2018 22:41
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Petr Čech
vajkuba1234:4.4.2018 23:18

Souhlas, ja to psal v rychlosti, tak jsem to tam placnul.

Nahoru Odpovědět
4.4.2018 23:18
No hope, no future, JUST WAR!
Avatar
vajkuba1234
Člen
Avatar
Odpovídá na Adam Gajdečka
vajkuba1234:4.4.2018 23:18

Na to si udelej nove vlakno.

Nahoru Odpovědět
4.4.2018 23:18
No hope, no future, JUST WAR!
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Adam Gajdečka
Petr Čech:4.4.2018 23:40

smazat, prosím

Editováno 4.4.2018 23:41
Nahoru Odpovědět
4.4.2018 23:40
the cake is a lie
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 31 zpráv z 31.