HTTPService没有正确地对send()上的JSON编码嵌套对象

时间:2011-11-22 17:07:29

标签: ruby-on-rails-3 json actionscript-3 httpservice

我正在创建一个这样的对象:

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

现在我想将它发送到网络服务器(rails):

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并自行序列化吗?顺便说一句,序列化然后传递字符串不起作用,webserver接收空请求作为GET。

但我有点想使用httpservice类......

2 个答案:

答案 0 :(得分:1)

我强烈建议使用Mike Chamber's JSON serialization library在JSON中编码/解码(序列化)数据。

基本上,您需要将对象转换为JSON表示。 JSONEncoder class对此非常有用。

有一个useful (old but still very relevant for using HTTPService + JSON) tutorial可以通过它,但基本上你应该在你的“someProperty”值上调用JSON.encode()。

即:

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

答案 1 :(得分:1)

您可以将SerializationFilter与HTTPService一起使用,将您作为对象传递的数据正确序列化为HTTPService.send()

这种方法的工作方式是创建自定义SerializationFilter以执行所需的特定操作。在您的情况下,您希望将传出的主体Object转换为JSON格式的String。为此,您应该覆盖serializeBody方法:

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);
        }
    }
}

您可以在调用send()之前将此过滤器的实例分配给HTTPService:

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实例执行的所有操作调用此过滤器。您还可以向自定义过滤器添加更多覆盖方法,以处理传入的响应。