2016-02-24 3 views
5

Sto usando Newtonsoft JSON.NET per serializzare/deserializzare roba per me. Ma ho questa lista in cui essi sono di tipo Object:JSON.NET - Come faccio a includere la gestione dei nomi dei tipi primitivi C# che sono archiviati in un array/elenco come Tipo di oggetto

var list = new List<Object>() 
{ 
    "hi there", 
    1, 
    2.33 
}; 

Quando ho serializzare che con TypeNameHandling insieme a TypeNameHandling.All, mi aspettavo che darà anche un $type per ogni istanza sulla lista, ma non sembra per essere il caso. Ecco l'uscita effettiva:

{ 
    "$type": "System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib", 
    "$values": [ 
     "hi there", 
     1, 
     2.33 
    ] 
} 

ho bisogno di questo per avere specifica Tipo Nome Handling per questi tipi primitivi, perché se aggiungo un valore Int32 in alla lista e quando si torna dopo la deserializzazione è JSON.NET imposta come Int64. Questo è un grosso problema per me perché sto cercando di invocare alcuni metodi e per farlo ho bisogno di confrontare i parametri e DEVONO avere gli stessi tipi. C'è un modo o un'impostazione che puoi impostare in JSON.NET per ottenere ciò di cui ho bisogno?

Ho visto questo post ma quello che fa è che sta cercando di cambiare il comportamento predefinito e restituisce sempre Int32 che non è quello che sto cercando.

Qualsiasi aiuto sarebbe apprezzato. Grazie

+0

Avrete bisogno per avvolgere i tuoi primitivi in ​​qualcosa come 'TypeWrapper ' da [Deserializzare enum specifico in system.enum in Json.Net] (https://stackoverflow.com/questions/31351262/deserialize-specific-enum-into-system-enum- in-json-net). – dbc

risposta

1

È possibile creare una classe wrapper per i tipi primitivi, inclusi gli operatori impliciti come si vuole:

class TypeWrapper 
{ 
    public object Value { get; set; } 
    public string Type { get; set; } 

    public static implicit operator TypeWrapper(long value) 
    { 
     return new TypeWrapper { Value = value, Type = typeof(long).FullName }; 
    } 

    public static implicit operator long(TypeWrapper value) 
    { 
     return (long)value.Value; 
    } 

    public static implicit operator TypeWrapper(int value) 
    { 
     return new TypeWrapper { Value = value, Type = typeof(int).FullName }; 
    } 

    public static implicit operator int(TypeWrapper value) 
    { 
     return (int)value.Value; 
    } 
} 

Poi si dovrà tipi di elementi' quando i dati serialize:

var data = new List<TypeWrapper> { 1, 2L }; 
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data); 
Console.WriteLine(json); 

// result: [{"Value":1,"Type":"System.Int32"},{"Value":2,"Type":"System.Int64"}] 
+1

Sto ancora sperando in un modo più diretto di farlo (vale a dire un semplice cambiamento di impostazione o qualcosa del genere). Ma se non ce n'è, allora questo sarebbe probabilmente quello per cui andrò. Grazie – Bairose

Problemi correlati