簡體   English   中英

Json.net在MVC4中使用循環引用反序列化json

[英]Json.net deserialize json with circular reference in MVC4

我試圖用圓形引用反序列化對象圖,沒有運氣,

序列化循環引用時Json.net運行良好:向對象添加$ id並用$ ref = * objectId替換對象,當我將相同的數據發送回MVC動作時,它將不會正確反序列化 - 將$ ref替換為空物。

我使用json.net來序列化和反序列化,反序列化是在自定義IValueProvider中實現的 - https://json.codeplex.com/discussions/347099

我注意到反序列化為匿名對象時

JsonConverter.Deserialize(json);

它不會處理循環引用。 但是在使用泛型類型進行反序列化時

JsonConverter.Deserialize<EntityType>(json) 

它會正確反序列化。

但我找不到GetValueProvider中的類型(ControllerContext controllerContext)

任何幫助將不勝感激

編輯 - 在我目前的修復中,我將整個json作為字符串傳遞並使用

JsonConverter.Deserialize<EntityType>(json) 

在控制器的動作中使用正確的類型,但這絕對不是使用json + mvc4的正確方法...我需要一種更好的方法將它集成到mvc中,開始賞金

編輯 - 更多代碼類型:

[JsonObject(IsReference = true)]
public class DynamicEntity : EntityWithID<Guid>
{
    ....

    public virtual IList<DynamicEntity> ReferenceFields { get; set; }
}

要反序列化的json是Json.net的Serialize方法的輸出。

{"$id":"1","ReferenceFields":[{"$ref":"1"}],"Id":"9f9de7f3-865e-4511-aeac-a2ff01193b06"}

問題是與MVC的集成,因為json在服務器和客戶端之間來回傳遞。 我已經有了js方法來改變它來回到相同的格式 - 經過測試,我現在就像這樣使用它:

public ActionResult EntitySaveOrUpdate(string entity)
    {
        var entityToSave = JsonConvert.DeserializeObject<DynamicEntity>(entity);
        ...
    }

它工作正常,但我需要與MVC更好的集成,而不是在我的所有行動中反序列化...

The challenge is dynamically typing at compile-time an un-typed languages (JSON).

由於JSON實際上是Java腳本對象表示法 ,並且JavaScript是弱類型(或未鍵入),因此編譯時解釋器不確定“1”是指intdouble還是string類型。

請注意,使用DynamicEntity時不會遇到同樣的問題,因為允許運行時以類似於JavaScript的方式解釋。

  • 關於動態和靜態匿名類型如何處理反序列化的這篇文章有點陳舊,但仍然相關。 他們的方法是使用JsonConvert.DeserializeAnonymousType() - 一個動態方法 - 來返回匿名。

  • 這篇文章擴展了Web ApiDataContractJsonSerializer ,以及它如何使用匿名類型限制您的選項。 建議的答案是

“替換MediaTypeFormatter並插入我們自己的JSON序列化程序”

這相當於滿足您有限需求的大量工作。

你會發現,如果沒有使用Linq投影,你的DynamicEntity可能就像你會發現的那樣好。

您是否嘗試編寫JsonConverter並在ValueProviderFactory中注冊它。

JSONSerializer.Converters.Add(new DynamicEntityObjectConverter());

在轉換器內部,您可以JsonConverter.Deserialize<EntityType>(json)使用JsonConverter.Deserialize<EntityType>(json) ,它適用於循環引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM