[英]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”是指int , double還是string類型。
請注意,使用DynamicEntity時不會遇到同樣的問題,因為允許運行時以類似於JavaScript的方式解釋。
關於動態和靜態匿名類型如何處理反序列化的這篇文章有點陳舊,但仍然相關。 他們的方法是使用JsonConvert.DeserializeAnonymousType()
- 一個動態方法 - 來返回匿名。
這篇文章擴展了Web Api的DataContractJsonSerializer
,以及它如何使用匿名類型限制您的選項。 建議的答案是
“替換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.