Text.Json pomijanie roota

0

Hej,
Mam takiego JSON-a.

  "result" : {
    "subject" : {
      "authorizedClerks" : [ ],
      "regon" : "regon",
      "restorationDate" : "2019-02-21",
      "workingAddress" : "ul/ Prosta 49 00-838 Warszawa",
      "hasVirtualAccounts" : true,
      "statusVat" : "Zwolniony",
      "krs" : "0000636771",
      "restorationBasis" : "Ustawa o podatku od towarów i usług art. 96",
      "accountNumbers" : [ "90249000050247256316596736", "90249000050247256316596736" ],
      "registrationDenialBasis" : "Ustawa o podatku od towarów i usług art. 96",
      "nip" : "1111111111",
      "removalDate" : "2019-02-21",
      "partners" : [ ],
      "name" : "ABC Jan Nowak",
      "registrationLegalDate" : "2018-02-21",
      "removalBasis" : "Ustawa o podatku od towarów i usług Art. 97",
      "pesel" : "22222222222",
      "representatives" : [ {
        "firstName" : "Jan",
        "lastName" : "Nowak",
        "nip" : "1111111111",
        "companyName" : "Nazwa firmy"
      }, {
        "firstName" : "Jan",
        "lastName" : "Nowak",
        "nip" : "1111111111",
        "companyName" : "Nazwa firmy"
      } ],
      "residenceAddress" : "ul/ Chmielna 85/87 00-805 Warszawa",
      "registrationDenialDate" : "2019-02-21"
    },
    "requestDateTime": "19-11-2019 14:58:49",
    "requestId" : "d2n10-84df1a1"
  }
}

Podpowie mi ktoś w jaki sposób mogę się dostać do środka "subject" bez mapowania całego obiektu? szukałem jakiegoś atrybutu na kształt [XmlRoot()], ale nic nie znalazłem :/

0

A co to za różnica czy zmapuje cały czy nie? Weź go sparsuj do generycznego obiektu i odczytaj pole po prostu.

0
Riddle napisał(a):

A co to za różnica czy zmapuje cały czy nie? Weź go sparsuj do generycznego obiektu i odczytaj pole po prostu.

Może chce tylko wyciąć środek i pchnąć ten środek dalej do innego nanoservisu?
A może bawi się w mikro optumalizacje?
W zasadzie trudno powiedzieć bez większego kontekstu

UPDATE poza tym teraz widze że to nie jest poprawny Root JSON. To jest element mapy z etykietą/kluczem

0

mozesz po prostu zrobic klase

public class SomeModel
{
public SubjectModel Subject{get;set;}
}
public class SubjectModel
{
///tutaj wszystkie propertki ktore chcesz
}

i tyle ;)

0

@heyyou: no tak to mam zrobione, ale nie wydaje mi się to zbyt eleganckie :/.
@KamilAdam: Jest co cały obiekt JSON, ucięło mi { na początku. Nie ma w tym żadnego celu :D po prostu testuję sobie klasę Json z obszaru system.text
@Riddle: Możesz mi powiedzieć jak to parsowanie do generycznego obiektu miałoby wyglądać?

0

nie wiem co w tym nieeleganckiego, no ale możesz ewentualnie mieć cały model i używac atrybutu [JsonIgnore]

0

No właśnie mapowania całego obiektu chciałbym uniknąć. Chcę mieć jedynie klasę ze zmapowanym środkiem JSON-a bez dodawania:

{
public SubjectModel Subject{get;set;}
}
public class SubjectModel
{
///tutaj wszystkie propertki ktore chcesz
}

Żeby przechodzić w głąb, zamiast tego chcę mieć

public class Model
{
///tutaj wszystkie propertki ktore chcesz
}

I tyle, z ewentualnie jakimś atrybutem na klasie, który powie kompilatorowi, że to jest element JSON, od którego mam zacząć czytać.

0

@heyyou: chyba można by było stworzyć parser, na który nakładasz atrybut z parametrem, który mówi od którego momentu zacząć parsowanie. Coś na zasadzie [JsonRoot("subject")].
Ale fakt, było by to na zasadzie albo opakowania obecnego parsera i dodania atrybutu, albo parser poczatkowo musiałby trakować JSON jako tekst, a dopiero później parsować od odpowiedniego miejsca, co by było raczej mało wydajne.
Ostatecznie znalazłem rozwiązanie:

string json = File.ReadAllText("test.json");
JsonNode jsonNode = JsonNode.Parse(json);
JsonNode subject = jsonNode!["result"]!["subject"];
var deserializeJson = subject.Deserialize<Subject>();

jsonNode!["result"]!["subject"]; ten zapis pozwala przejść po rootcie (nie wiem czy to poprawna odmiana).
Swoją drogą odkryłem, że VS daje możliwość generowania klas na podstawie JSON, do tej pory marnowałem czas na ręczne opisywanie XD

1 użytkowników online, w tym zalogowanych: 0, gości: 1