How to serialize an enum using JSON.NET based on attribute?

The code below generates output like {"error_message":null,"status":"InvalidRequest"}where I would like to get it as{"error_message":null,"status":"INVALID_REQUEST"}

So simple, I was wondering how to honor an attribute PropertyNamewhen serializing with JSON.NET?

void Main()
{
    var payload = new GooglePlacesPayload();
    payload.Status = StatusCode.InvalidRequest;
    JsonConvert.SerializeObject(payload).Dump();
}

public class GooglePlacesPayload
{
    [JsonProperty(PropertyName = "error_message")]
    public string ErrorMessage { get; set; }

    [JsonProperty(PropertyName = "status")]
    [JsonConverter(typeof(StringEnumConverter))]
    public StatusCode Status { get; set; }
}

[Flags]
public enum StatusCode
{
    // reference https://developers.google.com/maps/premium/previous-licenses/articles/usage-limits#limitexceeded
    // reference https://developers.google.com/places/web-service/search#PlaceSearchStatusCodes

    None = 0,

    // indicates that no errors occurred; the place was successfully detected and at least one result was returned.
    [JsonProperty(PropertyName = "OK")]
    Ok = 1,
    // indicates that the search was successful but returned no results. This may occur if the search was passed a latlng in a remote location.
    [JsonProperty(PropertyName = "ZERO_RESULTS")]
    ZeroResults = 2,
    // indicates that you are over your quota.  The daily quotas are reset at midnight, Pacific Time.
    [JsonProperty(PropertyName = "OVER_QUERY_LIMIT")]
    OverQueryLimit = 4,
    // indicates that your request was denied, generally because of lack of an invalid key parameter.
    [JsonProperty(PropertyName = "REQUEST_DENIED")]
    RequestDenied = 8,
    // generally indicates that a required query parameter (location or radius) is missing.
    [JsonProperty(PropertyName = "INVALID_REQUEST")]
    InvalidRequest = 16,

    // When the Google Places service returns a status code other than OK, there may be an additional error_message field within the search response object. 
    // This field contains more detailed information about the reasons behind the given status code.
    Positive = Ok | ZeroResults,
    Negative = OverQueryLimit | RequestDenied | InvalidRequest

}
+4
source share
1 answer

[EnumMember(Value="INVALID_REQUEST")]must do it. Note that this is an attribute of the dotnet kernel, not newtonsoft-specific, so it can affect other things.

+3
source

Source: https://habr.com/ru/post/1662329/


All Articles