2011-11-22 71 views
0

我創造這樣一個對象:正確編碼JSON-的HTTPService不上的send()嵌套對象

var myObj:Object = new Object(); 
myObj["someProperty"] = { 
    anotherProperty: "someValue", 
    whateverProperty: "anotherValue" 
} 

現在我想將它發送到Web服務器(導軌):

var service:HTTPService = new HTTPService(); 
service.url = "http://server.com/some/path/entry.json"; 
service.method = URLRequestMethod.POST; 
service.send(myObj); 

的問題是,服務器接收這樣的JSON:

{"someProperty"=>"[object Object]"} 

這是一個HTTPService在問題?我應該使用舊的加載器/ urlrequest並序列化自己嗎?順便說一下,序列化,然後傳遞字符串不起作用,web服務器收到空的請求作爲GET。

,但我還挺想使用,雖然HTTPService類...

回答

1

您可以使用SerializationFilter與你的HTTPService正確序列傳遞作爲一個對象來HTTPService.send()數據。

其工作方式是創建一個自定義的SerializationFilter來執行所需的特定操作。在你的情況下,你想要將傳出的正文對象轉換爲JSON格式的字符串。調用send()

package 
{ 
    import mx.rpc.http.AbstractOperation; 
    import mx.rpc.http.SerializationFilter; 
    import com.adobe.serialization.json.JSON; 

    public class JSONSerializationFilter extends SerializationFilter 
    { 
     override public function serializeBody(operation:AbstractOperation, obj:Object):Object 
     { 
      return JSON.encode(obj); 
     } 
    } 
} 

您可以在此過濾器的實例分配給您的HTTPService:要做到這一點,你應該重寫serializeBody方法

var service:HTTPService = new HTTPService(); 
service.url = "http://server.com/some/path/entry.json"; 
service.method = URLRequestMethod.POST; 
//add the serialization filter 
service.serializationFilter = new JSONSerializationFilter(); 
service.send(myObj); 

一旦分配,這個過濾器將被調用的所有這個HTTPService實例執行的操作。您還可以在自定義過濾器中添加更多覆蓋方法來處理傳入響應。

+0

我在很多場合使用這些類,但httpservice並沒有爲send()方法使用字符串。所以它認爲這些參數是空的,將請求類型更改爲GET,並且服務器無法獲得任何內容。我只是想基本知道是否有人可以確認httpservice無法將嵌套對象編碼爲json。 – DasAntonym

+0

@DasAntonym - 對不起,這是一個更好的答案。我沒有測試過它的用途,但希望它能讓你走上正軌。 – shanethehat

+0

感謝shane,這絕對是一個很好的建議,可以研究這些序列化過濾器。現在唯一的問題是,我現在得到相同的行爲,就像我只是將JSON.encode(obj)傳遞給send()方法一樣。該請求成爲GET請求,服務器不收到任何內容。就像傳遞send()方法時一樣。 – DasAntonym

1

我強烈建議使用Mike Chamber's JSON serialization library編碼/解碼(序列化)的JSON數據。

基本上,您需要將您的對象轉換爲JSON表示。 JSONEncoder class對此很有用。

有一個useful (old but still very relevant for using HTTPService + JSON) tutorial通過它,但基本上你應該調用JSON.encode()你的「someProperty」值是什麼。

即:

var dataString:String = JSON.encode(dataValue); 
dataString = escape(dataString); 
myObj["someProperty"] = dataString; 
+0

這實際上是我想避免的。在本教程中,他們手動解碼屬性的值(這是附加到提交對象上的字符串類型)的值。我想要一個適當的json編碼的嵌套對象,因爲我不想實現非標準的方式來讀取rails中的數據。 – DasAntonym