35

我正在使用 NewtonSoft.JSON。跑步时

JsonConvert.SerializeObject(myObject)

它正在$id为我的 JSON 添加一个值 - 如下所示:

  "$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

我们可以$id使用一些 JsonSerializerSettings 或任何其他方法删除它吗?

如果是 - 那么如何...

4

6 回答 6

53

我将此代码添加到我的 WebApiConfig 注册方法中,并删除了 JSON 中的所有 $id。

var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
于 2012-10-05T14:56:01.813 回答
9

如果由于某种原因您正在使用自定义 ContractResolver,请查看其他堆栈溢出;

尽管将 PreserveReferencesHandling 设置为“无”,Json.Net 仍将 $id 添加到 EF 对象

于 2013-10-14T17:36:57.067 回答
5

为我的 Web API 删除 JSON 中的 $id。我为我的类对象添加了 [JsonObject(IsReference = false)],为我的对象类型的属性添加了 [JsonProperty(IsReference = false)]。在我的情况下,RespObj 属性是通用类型 T 并且可以采用我传递给它的任何对象类型,包括集合,所以我不得不使用 [JsonProperty(IsReference = false)] 来摆脱序列化 JSON 字符串中的 $id。

我没有更改我的 WebApiConfig,因为我使用的是 WEB API 的 MVC 帮助页面,并且它要求我在我的 webApiconfig 中进行此配置:

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; }

}
于 2017-09-05T05:17:40.690 回答
2

如果 'id' 是您的类的属性,则在其上应用 [JsonIgnore] 属性。否则,这可能是您问题的答案:

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

于 2012-07-19T10:04:48.333 回答
2

您可以保留基本配置:

Newtonsoft.Json.PreserveReferencesHandling.All;

我将这种代码格式用于我的方法

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

这对我来说可以。

于 2018-01-15T11:09:18.733 回答
1

自定义 ContractResolver 设置会覆盖 PreserveReferencesHandling 设置。

在 DefaultContractResolver/IContractResolver 的实现中,添加这个;

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

这与没有自定义 ContractResolver 的 PreserveReferencesHandling.None 设置类似

于 2017-11-03T00:04:19.727 回答