2016-03-28 10 views
4

ich diesen Fehler erhalte, wenn ich versuche unter dem JSON-String deserialisieren:Zusätzliche Informationen: Fehler beim Konvertieren Wert [string] eingeben [Enumeration]

Fehler:

Additional information: Error converting value "invalid_request_error" to type 'ErrorType'. Path 'type', line 2, position 33.

JSON-String

{ 
    "error": { 
    "type": "invalid_request_error", 
    "message": "Invalid request (check that your POST content type is application/x-www-form-urlencoded). If you have any questions, we can help at https://support.stripe.com/." 
    } 
} 

-Code

private void btnDeserialize_Click(object sender, EventArgs e) 
{ 
    var r = Components.JsonMapper.MapFromJson<Components.DTO.Error>(txtToDeserialize.Text, "error"); 
    txtDeserialized.Text = JsonConvert.SerializeObject(r); 
} 

JsonMapper

public static class JsonMapper 
{ 
    public static T MapFromJson<T>(string json, string parentToken = null) 
    { 
     var jsonToParse = string.IsNullOrEmpty(parentToken) ? json : JObject.Parse(json).SelectToken(parentToken).ToString(); 

     return JsonConvert.DeserializeObject<T>(jsonToParse); 
    } 
} 

Enum

public enum ErrorCode 
{ 
    Default, 

    [JsonProperty("invalid_number")] 
    InvalidNumber, 

    [JsonProperty("invalid_expiry_month")] 
    InvalidExpiryMonth, 

    [JsonProperty("invalid_expiry_year")] 
    InvalidExpiryYear, 

    [JsonProperty("invalid_cvc")] 
    InvalidCvc, 

    [JsonProperty("incorrect_number")] 
    IncorrectNumber, 

    [JsonProperty("expired_card")] 
    ExpiredCard, 

    [JsonProperty("incorrect_cvc")] 
    IncorrectCvc, 

    [JsonProperty("incorrect_zip")] 
    IncorrectZip, 

    [JsonProperty("card_declined")] 
    CardDeclined, 

    [JsonProperty("missing")] 
    Missing, 

    [JsonProperty("processing_error")] 
    ProcessingError 
} 

public enum ErrorType 
{ 
    Default, 

    [JsonProperty("api_connection_error")] 
    ApiConnectionError, 

    [JsonProperty("api_error")] 
    ApiError, 

    [JsonProperty("authentication_error")] 
    AuthenticationError, 

    [JsonProperty("card_error")] 
    CardError, 

    [JsonProperty("invalid_request_error")] 
    InvalidRequestError, 

    [JsonProperty("rate_limit_error")] 
    RateLimitError 
} 

Ich möchte als Zeichenfolge zur Verwendung von Aufzählungen eher bleiben.
Was könnte der gute Workaround dafür sein?

Antwort

1

Sie haben ein paar Probleme:

  1. Sie müssen StringEnumConverter verwenden Aufzählungen als Strings zu serialisieren.

  2. Anstatt [JsonProperty("enum_name")] müssen Sie [EnumMember(Value = "enum_name")] verwenden, um einen neu zugeordneten Enum-Namen anzugeben. Sie können auch [DataContract] hinzufügen, um vollständige Kompatibilität mit dem Data Contract Serializer zu gewährleisten.

  3. Sobald Sie Ihren JSON-String in ein JToken analysiert haben, wird es effizienter sein, es zu deserialisieren JToken.ToObject() oder JToken.CreateReader() verwenden. Keine Notwendigkeit, zu einem String zu serialisieren und dann von Grund auf neu zu analysieren.

So sollte Ihre Typen wie folgt aussehen:

[DataContract] 
public enum ErrorCode 
{ 
    Default, 

    [EnumMember(Value = "invalid_number")] 
    InvalidNumber, 

    [EnumMember(Value = "invalid_expiry_month")] 
    InvalidExpiryMonth, 

    [JsonProperty("invalid_expiry_year")] 
    InvalidExpiryYear, 

    [EnumMember(Value = "invalid_cvc")] 
    InvalidCvc, 

    [EnumMember(Value = "incorrect_number")] 
    IncorrectNumber, 

    [EnumMember(Value = "expired_card")] 
    ExpiredCard, 

    [EnumMember(Value = "incorrect_cvc")] 
    IncorrectCvc, 

    [EnumMember(Value = "incorrect_zip")] 
    IncorrectZip, 

    [EnumMember(Value = "card_declined")] 
    CardDeclined, 

    [EnumMember(Value = "missing")] 
    Missing, 

    [EnumMember(Value = "processing_error")] 
    ProcessingError 
} 

public class Error 
{ 
    public ErrorType type { get; set; } 
    public string message { get; set; } 
} 

[DataContract] 
public enum ErrorType 
{ 
    Default, 

    [EnumMember(Value = "api_connection_error")] 
    ApiConnectionError, 

    [EnumMember(Value = "api_error")] 
    ApiError, 

    [EnumMember(Value = "authentication_error")] 
    AuthenticationError, 

    [EnumMember(Value = "card_error")] 
    CardError, 

    [EnumMember(Value = "invalid_request_error")] 
    InvalidRequestError, 

    [EnumMember(Value = "rate_limit_error")] 
    RateLimitError 
} 

Und Ihre Mapper:

public static class JsonMapper 
{ 
    private static JsonReader CreateReader(string json, string parentToken) 
    { 
     if (string.IsNullOrEmpty(parentToken)) 
      return new JsonTextReader(new StringReader(json)); 
     else 
     { 
      var token = JToken.Parse(json).SelectToken(parentToken); 
      return token == null ? null : token.CreateReader(); 
     } 
    } 

    public static T MapFromJson<T>(string json, string parentToken = null) 
    { 
     var settings = new JsonSerializerSettings { Converters = new [] { new StringEnumConverter() } }; 
     using (var reader = CreateReader(json, parentToken)) 
     { 
      if (reader == null) 
       return default(T); 
      return JsonSerializer.CreateDefault(settings).Deserialize<T>(reader); 
     } 
    } 
} 
+0

Sie meinen Tag retten! Vielen Dank! – fiberOptics

Verwandte Themen