AMcoder - javascript, python, java, html, php, sql

Ինչպե՞ս միացնել deserialized json-ի դասի տեսակը:

Ես ստանում եմ json, որը deserializing-ի դեպքում կարող է լինել ցանկացած դասի ասել.

  1. Հարց

  2. Պատասխանել

  3. Մեկնաբանություն

Այսպիսով, ես պետք է անցնեմ՝ հիմնվելով, թե որ դասին է պատկանում այդ json-ը:

Ներկայումս ես օգտագործում եմ սա ապասերիալիզացիայի համար: Բայց խնդիրն այն է, որ եթե ես սա օգտագործեմ, ես կանխամտածում եմ, թե ինչ տեսակ կստանամ:

Question question = new JavaScriptSerializer().Deserialize<Question>(payload);

Բայց փոխարենը ես ուզում եմ անել սա.

var jsonType = ParseJson(payload);
switch (jsonType)
{
   case Question: {Question question = new JavaScriptSerializer().Deserialize<Question>(payload); break;}
   case Answer: ...
   case Comment: ...
}

  • Դուք նաև վերահսկո՞ւմ եք սերիալային կողմը: Եթե ​​այո, ապա դուք կարող եք ստեղծել փաթաթման դաս բոլոր 3 տեսակների համար և սերիականացնել այն: 27.01.2018
  • Դա անելու արագ (եթե մի փոքր կեղտոտ) միջոց է JSON տողում որոնել տիպի անունը: 27.01.2018
  • JavaScriptSerializer-ը ներկայումս առաջարկված չէ Microsoft-ի կողմից նոր մշակման համար (նրանք փոխարենը խորհուրդ են տալիս json.net), բայց այն աջակցում է պոլիմորֆ տիպին: ակնարկելով. Տե՛ս JavaScriptSerializer՝ հատուկ տեսակով: 27.01.2018

Պատասխանները:


1

Սա կարող է իսկապես բարդ լինել: Եթե ​​կա «տեսակ» դաշտ, որը պարունակում է «Հարց», «Պատասխան» կամ «Մեկնաբանություն» արժեքները, կարող եք միացնել այն: Եթե ​​ոչ, դուք ստիպված կլինեք միացնել այլ բան և օգտագործել այն որպես անուղղակի մարկեր: Դա կարող է վտանգավոր լինել, եթե/երբ ինչ-որ բան փոխվի:

Համենայն դեպս, դուք կարող եք փորձել Newtonsoft JSON.NET-ը, մասնավորապես JObjectTryGetValue-ը (չգիտեմ՝ Microsoft-ի JavaScriptSerializer-ում կա արդյոք համարժեք):

    var jsonString = "{ \"foo\" : \"bar\" }";
    var obj = JObject.Parse(jsonString);

    if(obj.TryGetValue("foo", out JToken val1))
    {
        Console.Write("Foo is in there!");
    }

Այդ օրինակում val1-ը պարունակում է «բար» արժեք:

27.01.2018
  • շնորհակալություն այս լուծման համար: ես ի վիճակի եմ սա գործի դնել: 30.01.2018

  • 2

    Խորհուրդ եմ տալիս JavaScriptSerializer-ի փոխարեն օգտագործել JSON.NET:

    Եթե ​​ParseJSON-ը վերադարձնում է օբյեկտ Question, Answer և ... տեսակներով, կարող եք օգտագործել ստորև ներկայացված լուծումը.

    var jsonType = ParseJson(payload);
    switch (jsonType.GetType().FullName)
    {
       case "YourAssembly.Question": {Question question = new JavaScriptSerializer().Deserialize<Question>(payload); break;}
       case "YourAssembly.Answer": ...
       case "YourAssembly.Comment": ...
    }
    
    27.01.2018
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..