serializeobject serialize newtonsoft net jsonproperty jsonconverter jsonconvert jsonarrayattribute example attribute json.net

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;



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í.