在 OpenRasta 中使用任意 JSON 对象

发布于 2024-12-04 23:06:00 字数 479 浏览 0 评论 0原文

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

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

(JsonValue 的一个缺点是 MS 尚未发布它,因此您还无法将其部署给客户 (请参阅 1.“其他使用权利”)。但在重要的情况下,任何其他 Json 库,例如 Json.NET可以使用。)

I can't seem to find anything in the OpenRasta docs or tutorials that shows how to use arbitrary JSON objects (i.e. objects not predefined using C# classes) for both receiving from and responding back to the client.

One way to do it would be to use JsonValue and write a custom codec that would just use the (de)serialization features provided by JsonValue. That should be pretty straightforward and less than 50 lines of code, but I wondered if there isn't anything built into OpenRasta?

(One downside of JsonValue is that MS has not yet released it, so you can't yet deploy it to customers (see 1. "Additional Use Rights"). But in cases where that matters, any other Json library, like Json.NET can be used.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

下雨或天晴 2024-12-11 23:06:00

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

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

I have written, like most people, a very simple codec that supports dynamics as inputs and outputs to handlers using json.net. You can also register that codec with an anonymous type and it works brilliantly. You end up with this:

public object Post(dynamic myCustomer) {
  return new { response = myCustomer.Id };
}
溇涏 2024-12-11 23:06:00

我刚刚使用 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>();

I just implemented a JSON codec using JsonFx. It goes like this:

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

If it is registered for "object" then it seems to work for any class:

ResourceSpace.Has.ResourcesOfType<object>()
                 .WithoutUri
                 .TranscodedBy<JsonFXCodec>();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文