2012-07-18 20 views
21

我正在使用NewtonSoft.JSON ... JsonConvert.SerializeObject(myObject)之後。 它是附加的$ id ... 像

「的$ id」: 「1」, 「BookingId」:0, 「CompanyId」:0, 「IsCashBooking」:假的, 「付款方法「:0, 「IsReferral」:假, 「IsReferralPercent」:假, 「ReferralPaymentType」:0, 「ReferralDues」:0, 「PassengerId」:0, 「DepartmentID的」:0, 「CostCenterID」 :0, 「DeadMiles」:0

可以通過我們或JsonSerializerSettings通過任何其他方式消除這種的$ id如果是,那麼如何?

回答

40

我將此代碼添加到我的WebApiConfig寄存器方法和我擺脫了在JSON所有的$ id的。

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

如果不需要遞歸序列化(序列化層次結構),則爲有效答案。 $ id用於保存句柄,所以如果元素重複某個地方不會重複數據,它會將重複項的$ ref屬性設置爲原始的$ id。在這種情況下,必須將此屬性設置爲Newtonsoft.Json.PreserveReferencesHandling.Objects,並且可以使用Sajid的答案。 – parliament 2013-07-29 01:31:59

+0

謝謝你是偉大的:) – semirturgay 2014-06-05 12:58:11

+0

你爲我節省了一天 – Polymorphism 2014-06-05 12:59:01

3

如果「身份證」是你的類的屬性,然後在其上應用[JsonIgnore]屬性。 否則可能這裏是你的問題的答案:

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

+1

*強制* NewtonSoft使用* object *的id屬性值作爲$ $ id字段,或者簡單地使用'id'屬性來引用處理?這似乎是最合理的用法,因爲允許序列化器根據要序列化的圖對象的總數生成不同的'id'。 (這是一個問題,如果你是一個單獨的序列化對象,然後需要組裝成一個對象並反序列化) – JoeBrockhaus 2015-03-31 21:58:17

+1

@JoeBrockhaus在這裏實現信息:http://stackoverflow.com/questions/9237939/how-to-use -custom-reference-resolving-with-json-net – arichards 2016-03-30 16:09:29

2

爲了消除JSON的$​​ ID爲我的網絡API。我爲我的類對象包含[JsonObject(IsReference = false)],爲我的對象類型的屬性包含[JsonProperty(IsReference = false)]。在我的情況下,RespObj屬性是泛型類型T,並且可以接受任何對象類型,包括集合,所以我必須使用[JsonProperty(IsReference = false)]來取消序列化JSON字符串中的$ id。

,因爲我用的是MVC幫助頁面WEB API我沒有改變我的WebApiConfig,並在我的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; } 

} 
1

自定義ContractResolver設置將覆蓋PreserveReferencesHandling設置。

在你的DefaultContractResolver/IContractResolver實現中,添加這個;

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

它的行爲與PreserveReferencesHandling類似。沒有自定義ContractResolver

0

無設置你可以保持基本配置:

Newtonsoft.Json.PreserveReferencesHandling.All; 

我用這個代碼格式爲我的方法

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

它工作正常的我。

相關問題