2011-09-15 34 views
0

我似乎无法在OpenRasta文档或教程中找到任何显示如何使用任意JSON对象(即未使用C#类预定义的对象)从客户端接收和响应客户端。在OpenRasta中使用任意JSON对象

一种方法是使用JsonValue并编写一个只使用JsonValue提供的(de)序列化功能的自定义编解码器。这应该是相当直接的,少于50行的代码,但我想知道OpenRasta是否没有内置任何东西? JsonValue的一个缺点是MS尚未发布它,所以you can't yet deploy it to customers(参见1.“附加使用权利”)。但是,在其他情况下,可以使用其他任何Json库,例如Json.NET)。

回答

0

与大多数人一样,我写了一个非常简单的编解码器,它支持使用json.net的处理程序的动态输入和输出。您还可以使用匿名类型注册该编解码器,并且其效果出色。你最终与此:

public object Post(dynamic myCustomer) { 
    return new { response = myCustomer.Id }; 
} 
+0

想分享您的实施,使每个人都可以使用它呢?这似乎是一个常见的用例,尤其是在使用允许动态JSON对象的REST API时,您无法指定类文件。你是OpenRasta的作者,对吧?我想你会找到一些地方把它放在网上... :) P.S.你的答案是:“OpenRasta没有内置的东西”,对吗? –

+1

这个周末我可以推开包装,确实很简单。可能也值得一篇博文。你可以在OpenRasta中使用的技巧之一是没有URI的资源的注册遵守继承,所以如果你注册,那么从对象继承的任何东西(这就是所有东西)将能够被发送到编解码器。 – SerialSeb

+0

那太棒了。在你遇到它的情况下,请将其添加到你的答案中。 –

0

我刚刚使用JsonFx实现了一个JSON编解码器。它是这样的:

using System.IO; 
using System.Text; 
using JsonFx.Json; 


namespace Example 
{ 
    [global::OpenRasta.Codecs.MediaType("application/json")] 
    public class JsonFXCodec : global::OpenRasta.Codecs.IMediaTypeWriter, global::OpenRasta.Codecs.IMediaTypeReader 
    { 
    public void WriteTo(object entity, global::OpenRasta.Web.IHttpEntity response, string[] codecParameters) 
    { 
     JsonWriter json = new JsonWriter(); 
     using (TextWriter w = new StreamWriter(response.Stream, Encoding.UTF8)) 
     { 
     json.Write(entity, w); 
     } 
    } 


    public object ReadFrom(global::OpenRasta.Web.IHttpEntity request, global::OpenRasta.TypeSystem.IType destinationType, string destinationName) 
    { 
     JsonReader json = new JsonReader(); 
     using (TextReader r = new StreamReader(request.Stream, Encoding.UTF8)) 
     { 
     return json.Read(r, destinationType.StaticType); 
     } 
    } 


    public object Configuration { get; set; } 
    } 
} 

如果注册了“对象”,那么它似乎对任何类工作:

ResourceSpace.Has.ResourcesOfType<object>() 
       .WithoutUri 
       .TranscodedBy<JsonFXCodec>();