2011-09-15 75 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>();