Ответ 1
Я добавил этот код в свой метод регистрации WebApiConfig, и я избавился от всего $id в JSON.
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
Я использую NewtonSoft.JSON... После JsonConvert.SerializeObject(myObject). Он добавляет $id... как
"$ id": "1", "Бронирование": 0, "CompanyId": 0, "IsCashBooking": false, "PaymentMethod": 0, "IsReferral": false, "IsReferralPercent": false, "ReferralPaymentType": 0, "ReferralDues": 0, "PassengerId": 0, "DepartmentID": 0, "CostCenterID": 0, "DeadMiles": 0
можно удалить этот $id с помощью JsonSerializerSettings или любым другим способом, если да, то как...
Я добавил этот код в свой метод регистрации WebApiConfig, и я избавился от всего $id в JSON.
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
Если по какой-то причине вы используете пользовательский ContractResolver, посмотрите на это переполнение стека,
В случае, если 'id' является свойством вашего класса, тогда примените к нему атрибут [JsonIgnore]. В противном случае, вероятно, вот ответ на ваш вопрос:
http://james.newtonking.com/json/help/index.html?topic=html/PreserveObjectReferences.htm
Чтобы удалить $id в JSON для моего веб-API. Я включил [JsonObject (IsReference = false)] для объектов класса и [JsonProperty (IsReference = false)] для моих свойств, которые относятся к типам объектов. В моем случае свойство RespObj является общим типом T и может принимать любой тип объекта, который я передаю ему, включая коллекции, поэтому мне пришлось использовать [JsonProperty (IsReference = false)], чтобы избавиться от $id в сериализованной строке JSON.
Я не изменял свой WebApiConfig, потому что я использовал справочную страницу MVC для WEB API, и мне потребовалась такая конфигурация в моем веб-приложении:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
Объект класса
[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; }
}
Пользовательская настройка ContractResolver переопределяет настройку PreserveReferencesHandling.
В вашей реализации DefaultContractResolver/IContractResolver добавьте это:
public override JsonContract ResolveContract(Type type) {
var contract = base.ResolveContract(type);
contract.IsReference = false;
return contract;
}
Это ведет себя аналогично настройке PreserveReferencesHandling.None без пользовательского ContractResolver
Вы можете сохранить базовую конфигурацию:
Newtonsoft.Json.PreserveReferencesHandling.All;
Я использовал этот код для своих методов
public JsonResult<T> Get()
{
return Json(result);
}
Это отлично работает для меня.