tags:

views:

436

answers:

1

Hi there,

I'm implementing a generic restful api in WCF. I require access to a generic object deserialized from JSON (as a parameter to a POST operation). I'm using the raw programming model to permit fine-grained control of the return format. For example:

// Create
[OperationContract(Name = "CreateJSON")]
[WebInvoke(UriTemplate = "{endpointName}", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Stream Create(Object input, String endpointName);

In the above example the generic object is given by the parameter 'input' that I expect to be the POST payload. An analogous call works fine with an endpoint targeted for xml, but not JSON.

Any ideas/assistance would be greatly appreciated. Anyone?

A: 

Hi!

There is a namespace System.Runtime.Serialization.Json

To serialize generic object you can do like this:

/// Object to Json
let internal json<'t> (myObj:'t) =  
        use ms = new MemoryStream()
        (new DataContractJsonSerializer(typeof<'t>)).WriteObject(ms, myObj)
        Encoding.Default.GetString(ms.ToArray())

...

/// Object from Json
let internal unjson<'t> (jsonString:string)  : 't = 
        use ms = new MemoryStream(ASCIIEncoding.Default.GetBytes(jsonString))
        let obj = (new DataContractJsonSerializer(typeof<'t>)).ReadObject(ms)
        obj :?> 't

I hope that F# is ok... ;-)

Tuomas Hietanen