2016-07-11 1 views
0
{ 
    "timeAgo": "6 minutes ago", 
    "time": "07/11/2016 07:00 AM", 
    "alertId": 145928, 
    "details": { 


    }, 
    "priority": 10, 
    "type": 2, 
    "isClosed": 0, 
    "notesCount": 0, 
    "patientAccountId": 680, 
    "isRead": 0 
    } 

ich die json basierend auf der int-Wert ‚Typ‘, in wie Weise deserialisieren wollen, möchte ich die Details verschiedene ArtenC# Json deserialisieren basierend auf Zustand

public class Notification 
{ 
    public string timeAgo { get; set; } 
    public string time { get; set; } 
    public int alertId { get; set; } 
    public object details { get; set; } 
    public int priority { get; set; } 
    public int type { get; set; } 
    public int isClosed { get; set; } 
    public int notesCount { get; set; } 
    public int patientAccountId { get; set; } 
    public int isRead { get; set; } 
} 

, wenn der Typ sein = 1, dann ist das Objekt 'Details' vom Typ A, wenn Typ = 2, 'Details' vom Typ B und so weiter. Es gibt ungefähr 25 Werte für den Typ.

Also, später kann ich so etwas wie:

Notification n = .... 
if (type == 1) 
{ 
    A a = (a) n.details; 

Antwort

-1
var json = "{\r\n \"timeAgo\": \"6 minutes ago\",\r\n \"time\": \"07/11/2016 07:00 AM\",\r\n \"alertId\": 145928,\r\n \"details\": {\r\n\r\n\r\n },\r\n \"priority\": 10,\r\n \"type\": 2,\r\n \"isClosed\": 0,\r\n \"notesCount\": 0,\r\n \"patientAccountId\": 680,\r\n \"isRead\": 0\r\n }"; 
Notification data = JsonConvert.DeserializeObject<Notification>(json); 

var type=1; 
if (type == 1) 
    { 
    string[] a = data.details as string[]; 
    } 
+0

Während dieser Code-Schnipsel, die Frage lösen kann, [einschließlich einer Erklärung] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) hilft wirklich, die Qualität zu verbessern, deine Post. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erklärenden Kommentaren zu füllen, dies reduziert die Lesbarkeit sowohl des Codes als auch der Erklärungen! – kayess

+0

Ich werde das nächste Mal versuchen –

+0

Fügen Sie jetzt eine kurze Erklärung hinzu, Sie können es bearbeiten. –

0

Sie spezielle Einstellungen JSON Serializer verwenden können, wie

var jsonSerializerSettings = new JsonSerializerSettings() 
    { 
     TypeNameHandling = TypeNameHandling.All 
    }; 

Typ Name wird mit den tatsächlichen "Details" Daten gespeichert werden , so können Sie es zur gültigen Klasse deserialisieren.

var instance = new Notification 
     { 
      details = new Details 
      { 
       Name = "Hello" 
      } 
     }; 
var json = JsonConvert.SerializeObject(instance, jsonSerializerSettings); 

Produziert json

{"$type":"Application.Notification, Application","details":{"$type":"Application.Details, Application","Name":"Hello"}} 
1

Wenn Ihr json nicht über entsprechende Eingabe in die JSON enthalten ist, wird diese Arbeit.

Dies muss möglicherweise optimiert werden, wenn Ihre tatsächliche Struktur komplexer ist, aber ich habe es geschafft, dies an Ihre Probe zu arbeiten.

var instance = Newtonsoft.Json.JsonConvert.DeserializeObject<Notification>(
    js, 
    new ItemConverter()); 

public class ItemA : Item { } 
public class ItemB : Item { } 
public class Item { } 

public class Notification 
{ 
    public string timeAgo { get; set; } 
    public string time { get; set; } 
    public int alertId { get; set; } 
    public Item details { get; set; } 
    public int priority { get; set; } 
    public int type { get; set; } 
    public int isClosed { get; set; } 
    public int notesCount { get; set; } 
    public int patientAccountId { get; set; } 
    public int isRead { get; set; } 
} 

public class ItemConverter : JsonConverter 
{ 
    private Type currentType; 
    public override bool CanConvert(Type objectType) 
    { 
     return typeof(Item).IsAssignableFrom(objectType) || objectType == typeof(Notification); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     JObject item = JObject.Load(reader); 
     if (item["type"] != null) 
     { 
      // save the type for later. 
      switch (item["type"].Value<int>()) 
      { 
       case 1: 
        currentType = typeof(ItemA); 
        break; 
       default: 
        currentType = typeof(ItemB); 
        break; 
      } 
      return item.ToObject<Notification>(); 
     } 

     // use the last type you read to serialise. 
     return item.ToObject(currentType); 
    } 

    public override void WriteJson(JsonWriter writer, 
     object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Ich habe diesen Fehler: Typ ist keine Verteidigung für 'IsAssignableFrom' und keine Erweiterungsmethode 'IsAssignableFrom' akzeptiert ein erstes Argument vom Typ 'Type' gefunden werden konnte, in der Zeile "return typeof (NotificationDetails) .IsAssignableFrom (objectType) || objectType == typeof (Benachrichtigung); " – HeisenBerg

+0

anstelle von Artikel in Ihrem Beispiel, ich schuf eine Klasse namens NotificationDetails – HeisenBerg

+0

Oh, es war, weil ich es in einem PCL verwendet habe, löste ich es durch "Rückgabetypof (NotificationDetails) .IsAssignableFrom (Objekttyp) || Objekttyp == typeof (Benachrichtigung); " – HeisenBerg