Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
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í.
discount 30 + hiring
Avatar
Jiří Novák:10. července 19:31

Ahoj všichni.

Jsem začátečník v C# a potřebuji poradit s vytvořením třídy pro deserializaci JSON stringu (JsonSerializer­.Deserialize.­..) pro následující JSON:

[
   {
      "a":"a-in"
   },
   {
      "a":{
         "a":"a2-in"
      }
   }
]

Problém mi nastal v přetypování klíče "a" jednou je to string a podruhé je to object. Takže jak napsat trřídu pro tento vzor (dejme tomu, že se bude jmenovat testA?

Zkusil jsem:

public class testA{
                public string a { get; set; }  // ?
                ...
        }

Chci docílit:

string json2 = "[{\"a\":\"a-in\"},{\"a\":{\"a\":\"a2-in\"}}]";
testA loA = JsonSerializer.Deserialize<testA>(json2);
MessageBox.Show(loA.a);
 
Odpovědět
10. července 19:31
Avatar
zelvicek
Člen
Avatar
Odpovídá na Jiří Novák
zelvicek:14. července 8:32
  1. Daný příklad samozřejmě nemůže fungovat, protože data mají formát pole, kdežto deserializace je do objektu.
  2. Asi nejjednodušší způsob, jak daný kód zprovoznit, je nastavit datový typ property "a" System.Object. Ale s výsledkem asi nebudeš moc spokojený.
  3. Daný problém je dost specifický. Jakožto implementátor readeru bych se zajímal o důvodech takové struktury. Jistě k ní bude existovat popis (ta data jsou nějak vytvářena), a na jeho základě bych udělal reader s využitím Utf8JsonReader.
 
Nahoru Odpovědět
14. července 8:32
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15. července 12:24

google = js json
https://developer.mozilla.org/…Objects/JSON

<script>
JSON.parse(value)
JSON.stringify(value)
</script>

google = c sharp json
https://docs.microsoft.com/…-json-how-to?…

var weatherForecast = new WeatherForecast
           {
               Date = DateTime.Parse("2019-08-01"),
               TemperatureCelsius = 25,
               Summary = "Hot"
           };

           string jsonString = JsonSerializer.Serialize<WeatherForecast>(weatherForecast);

           Console.WriteLine(jsonString);

byte[] jsonUtf8Bytes =JsonSerializer.SerializeToUtf8Bytes(weatherForecast);

string jsonString =
@"{
  ""Date"": ""2019-08-01T00:00:00-07:00"",
  ""TemperatureCelsius"": 25,
  ""Summary"": ""Hot"",
  ""DatesAvailable"": [
    ""2019-08-01T00:00:00-07:00"",
    ""2019-08-02T00:00:00-07:00""
  ],
  ""TemperatureRanges"": {
                ""Cold"": {
                    ""High"": 20,
      ""Low"": -10
                },
    ""Hot"": {
                    ""High"": 60,
      ""Low"": 20
    }
            },
  ""SummaryWords"": [
    ""Cool"",
    ""Windy"",
    ""Humid""
  ]
}
";
            WeatherForecast? weatherForecast =
                JsonSerializer.Deserialize<WeatherForecast>(jsonString);

            Console.WriteLine($"Date: {weatherForecast?.Date}");
            Console.WriteLine($"TemperatureCelsius: {weatherForecast?.TemperatureCelsius}");
            Console.WriteLine($"Summary: {weatherForecast?.Summary}");
 
Nahoru Odpovědět
15. července 12:24
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na zelvicek
Jiří Novák:19. července 9:32

Díky za odpověď.

Důvod takovéto implementace vychází z toho, že původní data jsou převáděna z XML. Kde elementy můžou, ale nemusí mít atributy a pak nastává tento případ. Podle mezinárodních standardů k převodu je to všechno OK. Nemám možnost zasáhnout do převodu z/do XML, musím si poradit s již hotovým JSON.

 
Nahoru Odpovědět
19. července 9:32
Avatar
Odpovídá na Peter Mlich
Jiří Novák:19. července 9:39

Díky.
Tohle samozřejmě znám. Ale asi to neřeší přetypování klíče, kde je tento klíč v jednom a tom samém JSONu jednou typu string a podruhé je ten samý klíč typu objekt.

 
Nahoru Odpovědět
19. července 9:39
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 5 zpráv z 5.