NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Json Deserializace ze stringu?

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

Aktivity
Avatar
Martin
Člen
Avatar
Martin:26.2.2018 23:55

Ahoj, mam dotazek.
Server mi vrati tuto odpoved

{
    "Meta Data": {
        "1. Information": "Batch Stock Market Quotes",
        "2. Notes": "IEX Real-Time Price provided for free by IEX (https://iextrading.com/developer/).",
        "3. Time Zone": "US/Eastern"
    },
    "Stock Quotes": [
        {
            "1. symbol": "ESV",
            "2. price": "5.2050",
            "3. volume": "10681958",
            "4. timestamp": "2018-02-26 16:24:51"
        }
    ]
}

ja ale nejak nedokazu z newtonsoft jsonu pochopit jak to mam ulozit do objektu abych mohl napr vypsat zvlast symbol, zvlast price atd...
mam to ulozene jako string a dokazu to vypsat cele (proste cw(string);)
ale jak funguje napr newtonsoft deserializace, to mi proste nejde do hlavy.

Muze mi to tu nekdo vysvetlit prosim, s tim, ze metadata nejsou vubec relevantni, na ty muzu klidne zapomenout, nejsou potreba, zajima me pouze stock quotes.
Patlam se s tim uz nekolik hodin a proste nedokazu pochopit jak funguje deserializace.
Dokazu si napsat sam nejakou upravu textu, ale to nebude zrovna elegantni,radsi bych pochopil tohle.

Dekuji
Martin

 
Odpovědět
26.2.2018 23:55
Avatar
Odpovídá na Martin
Erik Šťastný:27.2.2018 8:03

Ahoj, je to opravdu jednoduché, vytvoříš si třídu, která přesně opisuje strukturu tvého JSON objektu a potom jen zavoláš jednu metodu, kde zadáš tu tvou třídu.

Napíšu ti příklad :)...

 
Nahoru Odpovědět
27.2.2018 8:03
Avatar
Odpovídá na Erik Šťastný
Erik Šťastný:27.2.2018 8:21

Takže například pro JSON:

{
        "boolean": true,
        "number": 123,
        "object": {
                "a": "b",
                "c": "d",
                "e": "f"
        },
        "string": "Hello World"
}

//

class Program
{
    static void Main(string[] args)
    {
        var json = @"{""boolean"":true,""number"":123,""obj"":{ ""a"":""b"",""c"":""d"",""e"":""f""},""str"":""Hello World""}";

        Deserialized d_json = JsonConvert.DeserializeObject<Deserialized>(json);

        // d_json objekt nyní obsahuje data naplněná z json stringu
    }
}

class Deserialized
{
    public bool boolean;
    public int number;
    public Dictionary<string, string> obj;
    public string str;
}

S čím ti ale bohužel nepomůžu tak je název s mezerou v životě by mě nenapadlo při tvoření JSONu, tak nějaký objekt pojmenovat, právě z tohodle důvodu, že to pro někoho akorát bude drbačka jak na to.

Editováno 27.2.2018 8:23
 
Nahoru Odpovědět
27.2.2018 8:21
Avatar
Martin
Člen
Avatar
Odpovídá na Erik Šťastný
Martin:27.2.2018 8:42

Ahoj, hned to skusim. Velice děkuji a mimochodem,jak jsem tak vycetl na netu, tak takhhle se zase dela nazev s mezerou

[JsonProperty("1. symbol")]
public string symbol {get; set}
 
Nahoru Odpovědět
27.2.2018 8:42
Avatar
Neaktivní uživatel:27.2.2018 8:43

Skus pouzit JsonPropertyAt­tribute nad danou property.

https://www.newtonsoft.com/…ertyName.htm

Nahoru Odpovědět
27.2.2018 8:43
Neaktivní uživatelský účet
Avatar
Odpovídá na Martin
Erik Šťastný:27.2.2018 8:44

Jo tak to vypadá easy, snad to bude fungovat i na deserializaci ale :)

Editováno 27.2.2018 8:45
 
Nahoru Odpovědět
27.2.2018 8:44
Avatar
Martin
Člen
Avatar
Martin:28.2.2018 6:32
Deserialized d_json = JsonConvert.DeserializeObject<Deserialized>(getDataFromWeb.Json);

        Console.WriteLine(d_json.StockQuotes["2. price"]);
        Console.ReadKey();


    }
}



public class Deserialized
{
    [JsonProperty("Meta Data")]
    public Dictionary<string, string> MetaData;

    [JsonProperty("Stock Quotes")]
    public Dictionary<string, string> StockQuotes;
}

Newtonsoft.Json­.JsonSerializa­tionException: 'Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'System.Collec­tions.Generic­.Dictionary`2[Sys­tem.String,Sys­tem.String]' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
Zrovna super to nefunguje :D.

Co psala Elisse slo super

 
Nahoru Odpovědět
28.2.2018 6:32
Avatar
Odpovídá na Martin
Erik Šťastný:28.2.2018 8:13

Máš špatně datové typy.

"Stock Quotes" není string, string dictionary, ale je to pole :) Podívej pořádně na ten JSON.

Dokonce ti to i píše, že to nemůže deserializovat pole na dictionary:

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'System.Collec­tions.Generic­.Dictionary

Editováno 28.2.2018 8:14
 
Nahoru Odpovědět
28.2.2018 8:13
Avatar
Adam Gajdečka:3.3.2018 21:39

A jaký bude kód, pokud nevíme, jaký název očekávat? Nelze tedy podle toho vytvořit třídu, která kopíruje ten json. Právě takový problém řeším, tak by mi to pomohlo. Díky

 
Nahoru Odpovědět
3.3.2018 21:39
Avatar
Odpovídá na Adam Gajdečka
don.jarducius:3.3.2018 22:12

Použij typ dynamic... Práce s ním je potom v lecčem podobná Dictionary.

Nahoru Odpovědět
3.3.2018 22:12
Ten kdo nechce hledá důvod, ten kdo chce hledá způsob
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 10 zpráv z 10.