2013-08-29 15 views
6

UPDATE Trovato il problema - è stato ereditato dalla classe sbagliata, doveva essere JsonConverter.serializzatore personalizzato per un solo immobile in Json.NET

Ho una classe che ha una proprietà Location di tipo System.Data.Entity.Spatial.DbGeography. Il serializzatore Json.NET di default mette fuori testo JSON come questo:

... 
    "PlaceType": 0, 
    "Location": { 
    "Geography": { 
     "CoordinateSystemId": 4326, 
     "WellKnownText": "POINT (-88.00000 44.00000)" 
    } 
    }, 
    "AddedDT": null, 
    ... 

voglio che mettere fuori testo come questo:

... 
    "PlaceType": 0, 
    "Location": [-88.00000,44.00000], 
    "AddedDT": null, 
    ... 

... così sembra a me che cosa devo fare sarebbe essere di sostituire qualsiasi convertitore attualmente utilizzato nel tipo DbGeography.

Gli esempi che ho visto finora che utilizzano CustomCreationConverters e ContractResolvers sembrano indicare come si sostituisce il serializzatore per la classe principale serializzata, non per un tipo che è solo una proprietà di quella classe. Gli esempi che comportano l'annotazione della classe che viene sovrascritta non funzionano per me perché non definisco DbGeography nel mio codice ed è effettivamente una classe chiusa perché non ha costruttore e può essere istanziata solo con i metodi di fabbrica internal.

C'è un modo per applicare un JsonConverter a un tipo correntemente? Se sì, come sarebbe il convertitore? Devo solo sovrascrivere il metodo WriteJson()?

risposta

4

È venuto fuori che avevo solo bisogno di ereditare da JsonConverter invece di CustomCreationConverter, e tutto il resto che stavo cercando di cambiare era OK da sempre.

Non sono ancora sicuro se c'è un modo per applicare fluentemente JsonConverter, ma c'è un altro modo per applicare JsonConverter senza fare riferimento a Json.NET nel proprio progetto dominio/core o contrassegnando le classi di dominio con i riferimenti a un biblioteca periferica:

var jsonSerializer = new JsonSerializer(); 
jsonSerializer.Converters.Add(new DbGeographyConverter()); 
jsonSerializer.Serialize(jsonWriter, place); 
+1

OK, devo aspettare due giorni per contrassegnare la mia domanda come risposta? Quindi un gruppo di persone dovrà guardarlo come se stessimo ancora aspettando una risposta? Tentato di cancellare il tutto. –

+1

È meglio lasciarlo fuori - gli altri potrebbero trarre beneficio da ciò che hai appreso. Hai fatto la cosa giusta, aggiornando la domanda per dire che è stata risolta nel frattempo. –

4

Utilizzare il JsonConverterAttribute sulla proprietà e definire un costume Converter-

per esempio, abbiamo una proprietà che entra come un valore di UNIX (long int) e ci serializzare ad un Net DateTime:

[JsonConverter(typeof(UnixTimeJsonConverter))] 
public DateTime Requested { get; set; } 
+0

Puoi fornire maggiori informazioni su come è tutto cablato insieme? Ho fatto i miei migliori due colpi a questo e non ha avuto alcun effetto. Aggiornerò la mia domanda con maggiori informazioni –

9

È possibile aggiungere un serializzatore personalizzato per un singolo attributo come questo:

public class Comment 
{ 
    public string Author { get; set; } 

    [JsonConverter(typeof(NiceDateConverter))] 
    public DateTime Date { get; set; } 

    public string Text { get; set; } 
} 

public class NiceDateConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var date = value as DateTime; 
     var niceLookingDate = date.ToString("MMMM dd, yyyy 'at' H:mm tt"); 
     writer.WriteValue(niceLookingDate); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter."); 
    } 

    public override bool CanRead 
    { 
     get { return false; } 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(DateTime); 
    } 
} 

Poi, quando si serializza il vostro oggetto con JsonConvert.SerializeObject(), verrà utilizzato il serializzatore personalizzato per la data propert y.

Problemi correlati