Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. 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í.
Avatar
Jiří Novák:10.7.2022 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.7.2022 19:31
Avatar
zelvicek
Člen
Avatar
Odpovídá na Jiří Novák
zelvicek:14.7.2022 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.7.2022 8:32
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:15.7.2022 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.7.2022 12:24
Avatar
Odpovídá na zelvicek
Jiří Novák:19.7.2022 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.7.2022 9:32
Avatar
Odpovídá na Peter Mlich
Jiří Novák:19.7.2022 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.7.2022 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.