在OpenRasta中使用任意JSON对象

时间:2011-09-15 05:36:16

标签: json openrasta

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

一种方法是使用JsonValue并编写一个自定义编解码器,它只使用JsonValue提供的(反)序列化功能。这应该是非常简单的,不到50行代码,但我想知道OpenRasta中是否没有内置任何东西?

(JsonValue的一个缺点是MS还没有发布它,所以you can't yet deploy it to customers(参见1.“附加使用权利”)。但是在重要的情况下,任何其他Json库,如{{3可以使用。)

2 个答案:

答案 0 :(得分:0)

我和大多数人一样,编写了一个非常简单的编解码器,它支持动态作为输入和输出使用json.net处理程序。您也可以使用匿名类型注册该编解码器,它的工作非常出色。你最终得到了这个:

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

答案 1 :(得分: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>();