2017-10-23 1 views
0

Ich verwende C# in VS2017. Ich habe eine json aus, wo ich Daten zu erhalten, und diese 3 Klassen:Store unbekannter Objekttyp

public class Azar 
{ 
    public int id_juego { get; set; } 
    public string timestamp { get; set; } 
    public int id_tipojuego { get; set; } 
    public string fecha { get; set; } 
    public int? sorteo { get; set; } 
    public object resultados { get; set; } 
    public string tipo_juego { get; set; } 
    public int tipo { get; set; } 
} 

public class ResultadoQuiniela 
{ 
    public string letras { get; set; } 
    public int[] numeros { get; set; } 
} 

public class ResultadoTelekino 
{ 
    public int sorteo { get; set; } 
    public int b1 { get; set; } 
    public int b2 { get; set; } 
    public int b3 { get; set; } 
    public int b4 { get; set; } 
    public int b5 { get; set; } 
    public int b6 { get; set; } 
    public int b7 { get; set; } 
    public int b8 { get; set; } 
    public int b9 { get; set; } 
    public int b10 { get; set; } 
    public int b11 { get; set; } 
    public int b12 { get; set; } 
    public int b13 { get; set; } 
    public int b14 { get; set; } 
    public int b15 { get; set; } 
    public int cat1 { get; set; } 
    public int cat2 { get; set; } 
    public int cat3 { get; set; } 
    public int cat4 { get; set; } 
    public int cat5 { get; set; } 
    public int cat6 { get; set; } 
    public int cat7 { get; set; } 
    public string prm1 { get; set; } 
    public string prm2 { get; set; } 
    public string prm3 { get; set; } 
    public string prm4 { get; set; } 
    public string prm5 { get; set; } 
    public string prm6 { get; set; } 
    public string prm7 { get; set; } 
    public string pozo { get; set; } 
    public string ext { get; set; } 
} 

Die Azar-> resultados Objekt eine der zwei Klassen sein kann, oder ResultadoQuiniela oder ResultadoTelekino. Ich weiß nicht, wer von ihnen ist, bis ich das JSON analysieren und das id_tipojuego sehe. Sobald ich weiß, dass ich das tue:

if(curAzar.id_tipojuego == 25) 
{ 
    ResultadoQuiniela resultados = (ResultadoQuiniela)curAzar.resultados; 
} 

Aber ich bekomme null Ergebnisse. Ich sehe, dass curAzar (ist das Ergebnis aus dem JSON geparst) wurde jedes Attribut gesetzt ABER das resultados Objekt. Wie kann ich diese Informationen "neutral" speichern und dann an das richtige Objekt übertragen? Wenn Sie es als Objekt deklarieren und es dann umsetzen, speichert es den Wert überhaupt nicht.

EDIT: Für die json Parsen Im mit Newtonsoft.Json

+2

Mögliche Duplikate von [Deserialize JSON in C# dynamisches Objekt?] (Https://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object) –

+1

Sie könnten einen benutzerdefinierten [JsonConverter schreiben ] (https://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm), die dies für Sie herausfinden, wenn Sie Json.net verwenden. Es braucht ein wenig Arbeit, um es einzurichten, und es kann für Endbenutzer sehr intransparent sein, aber Sie könnten anhand Ihrer Daten entscheiden, welche Art von Objekt ankommend ist. – Icepickle

+0

Was verwenden Sie zum Deserialisieren von Objekten aus JSON? – Valerii

Antwort

0

Ich fand eine Arbeitslösung: Als ich das resultado Feld (ein dynamisches Objekt) bekomme ich es in einen String umwandeln und sie dann auf die richtige Klasse Deserialisieren auf diese Weise entsprechend einer Bedingung:

JsonConvert.DeserializeObject<ResultadoQuiniela>(curAzar.resultado.ToString()); 

Dies funktioniert und gibt keine Fehler (wie eine reguläre Besetzung, die nicht möglich ist). Aber ich warte auf eine andere Antwort, falls es einen besseren Weg dafür gibt.

0

Haben Sie die Kontrolle über die Serialisierung dieser json haben auch? Wenn ja Blick in

JsonSerializerSettings.TypeNameHandling 

Wenn Sie Serializer erhalten, um Typ-Informationen in diesem json enthalten. Der Deserializer von Newtonsoft.Json wird es automatisch für Sie erledigen. Sie deklarieren einfach eine Basisklasse Resultado, von der die anderen 2 erben und dann in Ihrem Azar das öffentliche Objekt resultados {get; einstellen; }, Erklären

public Resultado resultado{ get; set; } 

oder

public Resultado[] resultados{ get; set; } 

je nachdem, was Sie erwarten.

+0

Können Sie etwas mehr erklären? –

+0

Zunächst, woher bekommst du das JSON? Wie in was erstellt es und können Sie den Code ändern, der es erstellt? –