2013-04-11 71 views
1

我有一個用例,我發佈一個複雜的對象與數組成員使用jQuery。例如:調試ServiceStack POST請求反序列化

data: { 
    obj1: obj1, 
    arr1: [ ... ] 
} 

在服務器上,我實現了ServiceStack服務。服務器上的自動請求映射會爲請求成員生成空值,但如果我提取Request.GetRawBody(),然後使用ServiceStack.Text.JsonSerializer.DeserializeFromString,則可以得到我所需的值。

調試實際的反序列化並查看缺少的內容將非常有用。有人知道怎麼做嗎?

例子:

傳遞一個平面物體 定義一個簡單的請求對象的幾個領域:

public class Request 
{ 
    public string Name { get; set; } 
} 

做一個jQuery的AJAX調用:

$.ajax({ 
    //... 
    data: { 
    name: 'John Doe' 
    } 
}); 

該調用起作用,服務器收到帶有「John Doe」的對象名稱屬性。與子對象

通行證對象

public class Request 
{ 
    public Caller Caller { get; set; } 
} 

public class Caller 
{ 
    public string Name { get; set; } 
} 

然後使從jQuery的一個電話:

$.ajax({ 
    // ... 
    data: { 
    caller: { 
     name: 'John Doe' 
    } 
    } 
}); 

呼叫後,對服務請求的「來電顯示」屬性「空「,所以這種方法是行不通的。

結論 在我原來的評估中,我指的是對象和數組的組合。我想問題是獲取一個簡單的子對象序列化/反序列化。這是否意味着這個概念不被支持,還是我錯誤地傳遞了這個對象?

回答

1

我想通了這個問題,希望回答幫助他人。事實證明,$。AJAX是發送內容類型編碼形式的URL(這是jQuery的文檔中明確記載,我剛剛錯過了它): http://api.jquery.com/jQuery.ajax/

設置的contentType爲「應用/ JSON的」解決了這個問題,現在所有的數據都在服務器上正確反序列化。

1

如果你真的認爲它的實際反序列化有問題,那麼我會建議從github下載源代碼並嘗試創建失敗的單元測試。如果你認爲它與json反序列化,然後下載ServiceStack.Text項目。否則,你應該下載主要的ServiceStack項目。閱讀現有的單元測試對於整個項目的工作過程是非常有益的。

但是,可能是無效的json表示法。通過比較序列化DTO的結果和實際傳遞給ajax調用的結果來反向設計json通常很有用。

更新時間:您的JSON應該是這樣的:

{"Caller":{"Name":"John Doe"}} 

最簡單的方法來檢查,這是做到以下幾點:

var r = new MyRequest() {Caller = new Caller() {Name = "John Doe"}}; 
var json = r.ToJson(); 
+0

感謝您的回覆。我其實不認爲有什麼問題,我很確定我做錯了什麼。我當然不認爲反序列化有什麼問題,當我簡單地反序列化身體時,它正在工作。我試圖找出什麼是不同的,當對象被映射到請求對象的服務堆棧,並且當身體被手動反序列化時。希望這是有道理的。如果不是,我可以提供代碼示例。 – user975060 2013-04-12 02:51:33

+0

我認爲這將有助於你提供特定的代碼示例。它將在未來爲其他人提供更多幫助。 – kampsj 2013-04-12 13:32:26

+0

我已更新原始條目,對不起,花了一段時間。 – user975060 2013-04-24 02:02:10