2012-11-09 61 views
2

In my last SO question,我問了如何修改Json.NET的序列化程序設置,ASP.NET Web API本身用於(反)序列化。被接受的答案完美工作,例如,我能夠將類型信息嵌入到序列化的JSON字符串中。在ASP.NET Web API中反序列化爲派生類

但是,當我嘗試將此JSON字符串返回給期望該模型的父類的Web API操作時,Web API仍反序列化爲父類,刪除與該子類相對應的所有數據,並防止轉換爲檢測兒童班。

class Entity { } 
class Person : Entity { } 

public Person Get() { 
    return new Person(); 
} 

public bool Post(Entity entity) { 
    return entity is Person; 
} 

一個簡單的例子會做這樣的事情在jQuery的:

// get a serialized JSON Person 
$.ajax({ 
    url : 'api/person'  // PersonController 
}).success(function (m) { 

    // then throw that Person right back via HTTP POST 
    $.ajax({ 
     url : 'api/person', 
     type : 'POST', 
     data : m 
    }).success(function (m) { 
     console.log(m);  // false 
    }); 

}) 

我期望通過修改Json.NET的JsonSerializerSettings嵌入類型信息它至少可以讀取,並試圖強制反序列化到這種類型,但顯然它不能。

我應該如何處理這樣的事情?

回答

1

Web API真的不會「本地」執行任何(de)序列化。它恰好在默認情況下包含在config.Formatters集合中的一些MediaTypeFormatter。隨意刪除這些內容,並創建自己的MediaTypeFormatter,以您希望的方式處理序列化。

MediaTypeFormatters真的不是很難創建。

+0

是啊,我也有考慮推出定製'MediaTypeFormatter'來處理任務,但它的思想作爲最後的手段。我一直在想,既然Web API默認使用了Json.NET,那麼上面可能會有些東西來調整/切換,但顯然它不那麼容易。 –

1

實際上,第二次POST調用正在發送application/x-www-form-urlencoded數據,這就是爲什麼JsonMediaTypeFormatter沒有拾取類型信息的原因。嘗試將contentType設置爲「application/json」。

此外,第二個POST請求主體中的數據似乎已被編碼,並且在發送回服務之前需要對其進行解碼。

我能得到這個工作:

// get a serialized JSON Person 
    $.ajax({ 
     url: 'api/person'  // PersonController 
    }).success(function (m) { 

     // then throw that Person right back via HTTP POST 
     $.ajax({ 
      url: 'api/person', 
      type: 'POST', 
      contentType: "application/json", 
      data: JSON.stringify(m), 
     }).success(function (m) { 
      alert(m);  // true! 
     }); 

    }) 
+0

酷,很好的捕獲。 :D將它連接起來,是的,數據以「Person」形式出現,但作爲「Entity」的實例仍然存在。它現在可以轉換爲Person(例如,現在的實體爲Person!== null),但它仍然缺少自動獲取「Person」的一個關鍵步驟。我可能不得不在你的答案中提供信息並用達雷爾的自定義'MediaTypeFormatter'的答案來打耳光。 : - /雖然很讚賞! –