Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Returning a string containing valid Json with Nancy

Tags:

json

c#

nancy

I receive a string that contains valid JSON from another service. I would like to just forward this string with Nancy but also set the content-type to "application/json" which will allow me to remove the need for using $.parseJSON(data) on the client side.

If I use Response.AsJson it seems to mangle the JSON in the string and adds escape characters. I could create a Stream with the string and set the response type something like:

Response test = new Response(); test.ContentType = "application/json"; test.Contents = new MemoryStream(Encoding.UTF8.GetBytes(myJsonString));  

but would like to know if there is a simpler way?

like image 315
Dave Avatar asked Sep 29 '11 12:09

Dave


2 Answers

Looks like Nancy has got a nice Response.AsJson extension method:

Get["/providers"] = _ =>             {                 var providers = this.interactiveDiagnostics                                     .AvailableDiagnostics                                     .Select(p => new { p.Name, p.Description, Type = p.GetType().Name, p.GetType().Namespace, Assembly = p.GetType().Assembly.GetName().Name })                                     .ToArray();                  return Response.AsJson(providers);             }; 
like image 133
Darius Avatar answered Sep 22 '22 16:09

Darius


I like that you think there should be a better way because you're having to use 3 lines of code, I think that says something about Nancy :-)

I can't think of a "better" way to do it, you can either do it the GetBytes way:

Get["/"] = _ =>     {         var jsonBytes = Encoding.UTF8.GetBytes(myJsonString);         return new Response             {                 ContentType = "application/json",                 Contents = s => s.Write(jsonBytes, 0, jsonBytes.Length)             };     }; 

Or the "cast a string" way:

Get["/"] = _ =>     {         var response = (Response)myJsonString;          response.ContentType = "application/json";          return response;     }; 

Both do the same thing - the latter is less code, the former more descriptive (imo).

like image 20
Steven Robbins Avatar answered Sep 18 '22 16:09

Steven Robbins