2013-12-17 35 views
2

我正嘗試將基於Web Api的項目轉換爲Servicestack,現在我在將複雜(客戶端)對象圖轉換爲C#動態類時遇到問題(因爲它是複雜和主要用於客戶端我不想創建一個C#表示這一點)。下面是一些剝離代碼(而不是精確的代碼,所以有可能是錯誤):將Web API轉換爲ServiceStack - JObject轉換爲JsonObject

OLD CODE:

[HttpPost] 
public HttpResponseMessage Save([FromBody] JObject jsonData) 
{ 

    dynamic jsonDataAsDynamic = jsonData; 
    var test = (JObject)jsonDataAsDynamic.TheComplexObjectGraphStringified; 
} 

上面的代碼工作沒有問題。

NEW CODE:

[Route("/SomeRoute/Save")] 
public class PostRequest 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
    public string TheComplexObjectGraphStringified { get; set; } 
} 

public object Post(PostRequest request) 
{ 
    var test = JsonObject.Parse(request.TheComplexObjectGraphStringified); 

} 

注:由於我在Servicestack新手我不(還)知道,如果不JsonObject.Parse一樣強制轉換爲JObject。

我的JavaScript調用:

$.ajax({ 
    type: "POST", 
    url: <save url>, 
    data: '{' + 
     '"A":' + a + 
     ',"B":' + b + 
     ',"TheComplexObjectGraphStringified":' + JSON.stringify(TheComplexObjectGraph) + 
    '}', 
    contentType: "application/json", 
    dataType: "json", 

示例數據:

的 'TheComplexObjectGraphStringified' 是將字符串化與JavaScript的內容(在客戶端)(您的關注這是谷歌的數據)後:

{「zoom」:12,「tilt」:0,「overlays」:[{「uniqueid」:1387287972247,「paths」:[[「lat」:52.096898776519055,「lng」:5.655044395378695} 「LAT」:52.093607315804085 「LNG」:5.655044395378695}]]}], 「中心」:{ 「LAT」:52.095253046161574 「LNG」:5.6594110316549 4}}

現在奇怪的是,當這到達服務器屬性'TheComplexObjectGraphStringified'引號被刪除!調試數據:

「{變焦:12,傾斜:0,覆蓋:< ...字符串的其餘部分...>」

正如你所看到的變焦沒有加引號的話(我期待着什麼像「{\」縮放\「:12」

我發現,如果我加入一些使用調試器JsonObject.Parse似乎工作逃脫手工報價

我在做什麼錯

回答

2

你?問題正在發生,因爲您在它之前沒有正確序列化數據到達ServiceStack服務器。

  • 在你的代碼已字符串化複雜的數據,但隨後手動試圖建立圍繞對象的JSON數據,將其發送到服務器之前。

  • 這種方法的問題是你沒有逃脫複雜的對象。

要解決的問題,您應該字符串化的數據對象:

$.ajax({ 
    type: "POST", 
    url: <save url>, 
    data: JSON.stringify({ 
     A: a, 
     B: b, 
     TheComplexObjectGraphStringified: JSON.stringify(TheComplexObjectGraph) 
    }), 
    contentType: "application/json", 
    dataType: "json", 
    ... 

我強烈建議你避免手工編寫JSON字符串。

我注意到如果我用手工添加一些轉義引號使用調試器JsonObject.Parse似乎工作。

是沒有給出有效的代碼JsonObject.Parse不應該工作的原因。

我還沒有知道JsonObject.Parse是否與JObject轉換相同。

是的,它的行爲相似。你可以看到ServiceStack.Text's support for dynamic JSON here的例子。 那裏的例子也包括一個Google Maps數據例子。它可能是有用的。

希望這會有所幫助。

+1

很多很多人感謝,我覺得自己像一個新手,考慮到我的非stringify解決方案。它現在有效!提供的鏈接真的很有用。 – Stackbever

+0

@Stackbever真棒,很高興它的工作。 – Scott