Kurren
Kurren

Reputation: 837

Map json input but not output in Suave

Suave.Json.mapJson maps the input JSON to an object into your function, then maps the output of your function into JSON.

The problem is that I'm happy with the way it maps into my function, but I need to return a json string response rather than have suave serialise my output into JSON for me. How can I do this?

Currently i'm getting my output serialised twice. My code so far:

let executeQuery : Query -> string = //Query is my deserialised json input, the return value is a json string
let app = POST >=> path "/graphql" >=> Json.mapJson executeQuery >=> setMimeType "application/json; charset=utf-8"
startWebServer defaultConfig app

Upvotes: 4

Views: 291

Answers (1)

rmunn
rmunn

Reputation: 36688

If you look at the Suave source code, you'll see that mapJson is shorthand for mapJsonWith fromJson toJson. The fromJson and toJson functions are the default JSON deserializer and serializer (respectively), but you could create your own instead -- or just use id to say "map this direction without changing it". E.g.,

let oneWayMapJson = mapJsonWith fromJson id

Note that I haven't tested this, just typed it into the Stack Overflow answer box, so some tweaking may be required. I don't have time to expand on this answer right now, but if you need more help than this rather barebones answer, let me know and I'll try to give you more help sometime tomorrow.

Upvotes: 5

Related Questions