F#, Json.NET 6.0 and WebApi - serialization of record types

asp.net-web-api, f#, json.net, serialization

Solution

You can adorn your records with the `[<CLIMutable>]` attribute:

[<CLIMutable>]
type MyDtr = {
    Message : string
    Time : string }

That's what I do.

For nice XML formatting, you can use:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer <- true

For nice JSON formatting, you can use:

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver <-
    Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()

Problem

Json.NET 6.0.1 adds F# support for records and discriminated unions. When serializing a F# record type using Json.NET I now get nicely formatted JSON. The serialization is done as follow: ``` let converters = [| (new StringEnumConverter() :> JsonConverter) |] JsonConvert.SerializeObject(questionSet, Formatting.Indented, converters) ``` However, when I try to expose my F# types through a ASP.NET WebApi 5.0 service, written in C#, the serialized JSON includes an @-sign infront of all properties. The @-sign comes from the internal backing field for the record type (this used to be a known problem with Json.Net and F#). But - since I'm using the updated version of Json.NET, shouldn't the result be the same as when calling JsonConvert? Or is `JsonConvert` behaving differently than `JsonTextWriter`and `JsonTextReader`? As far as I can tell from reading the `JsonMediaTypeFormatter` in the WebApi source `JsonTextWriter`and `JsonTextReader` is used by WebApi.

Original source

Related problems