2012-07-18 13 views
21

Sto usando NewtonSoft.JSON ... Dopo JsonConvert.SerializeObject (myObject). Si aggiungendo $ id ... come

"$ id": "1", "BookingId": 0, "CompanyID": 0, "IsCashBooking": false, "paymentmethod ": 0, "IsReferral": false, "IsReferralPercent": false, "ReferralPaymentType": 0, "ReferralDues": 0, "PassengerId": 0, "IDdipartimento": 0, "CostCenterID" : 0, "DeadMiles": 0

.210

possiamo rimuovere questo $ id da JsonSerializerSettings o con qualsiasi altro metodo se sì allora come ...

risposta

40

ho aggiunto questo codice per il mio metodo registro WebApiConfig e mi sono liberato di tutti i $ id in JSON.

var json = config.Formatters.JsonFormatter; 
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; 
+4

Risposte valide se non si necessita di serializzazione ricorsiva (serializzazione di una gerarchia). $ id è usato per preservare il manico, quindi se l'elemento si ripete da qualche parte, non ripeterà i dati, ma semplicemente imposterà $ ref proprietà del duplicato sull'ID $ dell'originale. In tal caso, questa proprietà deve essere impostata su Newtonsoft.Json.PreserveReferencesHandling.Objects e la risposta di Sajid potrebbero essere utilizzate. – parliament

+0

grazie sei fantastico :) – semirturgay

+0

Mi hai salvato la giornata – Polymorphism

3

In caso 'id' è una proprietà della classe quindi applicare [JsonIgnore] attributo su di esso. In caso contrario, probabilmente qui è la risposta per la tua domanda:

http://james.newtonking.com/json/help/index.html?topic=html/PreserveObjectReferences.htm

+1

Che dire * forzare * NewtonSoft a utilizzare il valore di proprietà 'id' * di * l'oggetto * come * il campo' $ id', o invece semplicemente utilizzare la proprietà 'id' per la gestione dei riferimenti? Questo sembra l'uso più logico, in quanto consentire al serializzatore di generare risultati in 'id diversi a seconda del numero totale di oggetti grafici che vengono serializzati. (Questo è un problema se si serializza individualmente gli oggetti che devono quindi essere assemblati in un singolo oggetto e deserializzati) – JoeBrockhaus

+1

@JoeBrockhaus Informazioni su come ottenerli qui: http://stackoverflow.com/questions/9237939/how-to-use -custom-reference-resolving-with-json-net – arichards

2

Per rimuovere il $ id in JSON per la mia web API. Ho incluso [JsonObject (IsReference = false)] per i miei oggetti di classe e [JsonProperty (IsReference = false)] per le mie proprietà che sono di tipi di oggetto. Nel mio caso la proprietà RespObj è di tipo generico T e potrebbe prendere qualsiasi tipo di oggetto I passandolo ad esso, comprese le raccolte, quindi ho dovuto usare [JsonProperty (IsReference = false)] per eliminare l'id $ nella stringa JSON serializzata.

Non ho cambiato il mio WebApiConfig perché stavo usando la pagina di aiuto MVC per WEB API e mi tenuti ad avere questa configurazione nel mio webApiconfig:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
     json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All; 
     json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize; 

L'oggetto di classe

[DataContract(IsReference = true)] 
[JsonObject(IsReference = false)] 
public class QMResponse<T> where T : new() 
{ 
    public QMResponse() 
    { 

    } 

    /// <summary> 
    /// The response code 
    /// </summary> 
    public string RespCode { get; set; } 

    /// <summary> 
    /// The response message 
    /// </summary> 
    public string RespMxg { get; set; } 

    /// <summary> 
    /// The exception message 
    /// </summary> 
    public string exception { get; set; } 

    /// <summary> 
    /// The object type returned 
    /// </summary>   
    [JsonProperty(IsReference = false)] 
    public T RespObj { get; set; } 

    /// <summary> 
    /// No of records returned 
    /// </summary> 
    public long RecordCount { get; set; } 

    /// <summary> 
    /// The Session Object 
    /// </summary> 
    public string session_id { get; set; } 

} 
1

L'impostazione di ContractResolver personalizzata sostituisce l'impostazione PreserveReferencesHandling.

Nell'implementazione di DefaultContractResolver/IContractResolver, aggiungere questo;

public override JsonContract ResolveContract(Type type) { 
    var contract = base.ResolveContract(type); 
    contract.IsReference = false; 
    return contract; 
} 

Questo comportamento si comporta in modo simile a PreserveReferencesHandling.Nessuno impostazione senza un costume ContractResolver

0

È possibile mantenere la configurazione di base:

Newtonsoft.Json.PreserveReferencesHandling.All; 

ho usato questo formato di codice per i miei metodi

public JsonResult<T> Get() 
{ 
    return Json(result); 
} 

Funziona bene per me.

Problemi correlati