2011-09-15 11 views
0

OpenRastaのドキュメントやチュートリアルでは、クライアントからの受信とクライアントへの返信の両方に任意のJSONオブジェクト(つまり、C#クラスを使用して事前定義されていないオブジェクト)を使用する方法はわかりません。 。OpenRastaでの任意のJSONオブジェクトの使用

JsonValueを使用して、JsonValueが提供する(デ)シリアライゼーション機能を使用するカスタムコーデックを作成する方法もあります。それはかなり簡単で、50行未満のコードでなければならないが、OpenRastaに組み込まれているものがないかどうか疑問に思った?

(JsonValueの欠点の1つは、MSがまだリリースしていないということです(you can't yet deploy it to customers)。

答えて

0

ほとんどの人のように、json.netを使用してダイナミックスを入力および出力としてサポートする非常に単純なコーデックを作成しました。コーデックを匿名のタイプで登録することもでき、すばらしい結果が得られます。あなたはこれで終わります:

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

は、誰もがそれを使用することができますので、あなたの実装を共有したいですか?これは、特にクラスファイルを指定できない動的JSONオブジェクトを可能にするREST APIを使用している場合によく使用されるようです。あなたはOpenRastaの作者ですよね?私はそれをオンラインにするための場所を見つけるだろうと思う... :) P.S.あなたの含意は、「OpenRastaには何も組み込まれていません」というのは正しいのですか? –

+1

私は今週のオープンラップでパッケージをプッシュすることができます、それはかなり簡単です。ブログ投稿の価値があるかもしれません。 OpenRastaで使用できるトリックの1つは、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>(); 
関連する問題