System.Cats.Lol
System.Cats.Lol

Reputation: 1770

Serialize enum as string in JSON returned from Azure Function

Is there a way to configure how Azure Functions serializes an object into JSON for the return value? I would like to use strings rather than ints for enum values.

For instance, given this code:-

public enum Sauce
{
    None,
    Hot
}

public class Dish
{
    [JsonConverter(typeof(StringEnumConverter))]
    public Sauce Sauce;
}

public static class MyFunction
{
    [FunctionName("MakeDinner")]
    public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
    {
        var dish = new Dish() { Sauce = Sauce.Hot };
        return req.CreateResponse(HttpStatusCode.OK, dish, "application/json");
    }
}

The function returns:-

{
   "Sauce": 1
}

How can I make it return the below?

{
   "Sauce": "Hot"
}

I've tried returning a string instead of an object, but the result contains \" escapes; I want a JSON result, not an escaped string representation of a JSON object.

I know that in standard ASP.NET I can use the config to set serialization options. Is this even possible in Functions, or should I convert all my Enums to string constants?

Upvotes: 5

Views: 3566

Answers (2)

NickBrooks
NickBrooks

Reputation: 91

This had me stumped for a while but check this answer.

Basically, use the Json.NET attribute StringEnumConverter.

[JsonConverter(typeof(StringEnumConverter))]
public enum Sauce
{
    [EnumMember(Value = "none")]
    None,
    [EnumMember(Value = "hot")]
    Hot
}

Upvotes: 4

Brando Zhang
Brando Zhang

Reputation: 27997

Based on my test, I found the default version of the Newtonsoft.Json(installed when you created the azure function project) is 10.0.2. By using this version of the Newtonsoft.Json, it will auto replace the enum string name with the number.

Here is a workaround, I suggest you could open the Nuget Package install the Newtonsoft.Json 9.0.1, then it will work well.

More details, you could refer to below image:

enter image description here

Result:

enter image description here

Upvotes: 2

Related Questions