json.net - serialize - jsonproperty attribute c#
cómo eliminar $ id durante la serialización JSON (6)
Estoy usando NewtonSoft.JSON. Cuando se ejecuta
JsonConvert.SerializeObject(myObject)
está agregando un valor de $id
a mi JSON, como este:
"$id": "1",
"BookingId": 0,
"CompanyId": 0,
"IsCashBooking": false,
"PaymentMethod": 0,
"IsReferral": false,
"IsReferralPercent": false,
"ReferralPaymentType": 0,
"ReferralDues": 0,
"PassengerId": 0,
"DepartmentID": 0,
"CostCenterID": 0,
"DeadMiles": 0
¿Podemos eliminar este $id
con algunos ajustes JsonSerializer o por cualquier otro método?
Si es así, entonces cómo...
Agregué este código a mi método de registro WebApiConfig y eliminé todos los $ id en JSON.
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
En caso de que ''id'' sea una propiedad de su clase, aplique el atributo [JsonIgnore] en ella. De lo contrario, probablemente aquí esté la respuesta a tu pregunta:
http://james.newtonking.com/json/help/index.html?topic=html/PreserveObjectReferences.htm
La configuración personalizada de ContractResolver anula la configuración PreserveReferencesHandling.
En su implementación de DefaultContractResolver / IContractResolver, agregue esto;
public override JsonContract ResolveContract(Type type) {
var contract = base.ResolveContract(type);
contract.IsReference = false;
return contract;
}
Esto se comporta de manera similar a la configuración PreserveReferencesHandling.None sin un ContractResolver personalizado
Para eliminar el $ id en JSON para mi API web. Incluí [JsonObject (IsReference = false)] para mis objetos de clase y [JsonProperty (IsReference = false)] para mis propiedades que son de tipo objeto. En mi caso, la propiedad RespObj es un Tipo T genérico y podría tomar cualquier tipo de objeto que le pase, incluidas las colecciones, así que tuve que usar [JsonProperty (IsReference = false)] para deshacerme del $ id en la cadena JSON serializada.
No cambié mi WebApiConfig porque estaba usando la página de ayuda de MVC para la API WEB y me exigía tener esta configuración en mi webApiconfig:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
El objeto de clase
[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; }
}
Puedes mantener la configuración básica:
Newtonsoft.Json.PreserveReferencesHandling.All;
Utilicé este formato de código para mis métodos.
public JsonResult<T> Get()
{
return Json(result);
}
Funciona bien para mí.
Si por alguna razón está usando un ContractResolver personalizado, eche un vistazo a este otro desbordamiento de pila;
Json.Net agrega $ id a los objetos EF a pesar de configurar PreserveReferencesHandling en "Ninguno"