Utilice JsonConvert.DeserializeObject cuando la cadena de entrada no sea Json válida y sea o comience con un número

StackOverflow https://stackoverflow.com//questions/22015670

Pregunta

Quiero encontrar una buena solución para manejar la deserializacion de cadenas simples que comienzan con un número o contienen solo un número, y entender por qué no funciona como está ahora.

No puedo controlar las cadenas de entrada, por lo que no puedo confiar en que sean Json válidos, y por el momento solo estoy comprobando si es Json y, si no lo es, lo envolveré en "[{}] ", pero quería ver si había una manera mejor.

Así es como lo estoy deserializando:

JsonConvert.DeserializeObject<MyClass[]>(myString);

Mi clase tiene dos propiedades:

[JsonProperty(PropertyName = "key")]
public string Key { get; set; }

[JsonProperty(PropertyName = "value")]
public string Value { get; set; }

Si la cadena de entrada es solo "a" o "a2", genera una excepción Newtonsoft.Json.JsonException ("Se encontró un carácter inesperado al analizar el valor:a.Ruta '', línea 0, posición 0.") que se esperaba, sin embargo, "2" y "2a" arrojan otros errores.Me gustaría el mismo comportamiento para "2" y "2a" que para "a" y "a2".

Excepción al pasar "2":

Newtonsoft.Json.JsonSerializationException : Error converting value 2 to type 'MyClass[]'. Path '', line 1, position 1.
System.ArgumentException : Could not cast or convert from System.Int64 to MyClass[].

Excepción al pasar en "2a":

System.FormatException : Input string was not in a correct format.

¿Por qué no funciona cuando la cadena contiene sólo números o comienza con un número?¿Existe una forma más inteligente de solucionar este problema que ajustar la cadena de entrada con "[{}]"?

¿Fue útil?

Solución

Su problema surge del analizador JSON y de lo que le está pasando.

2 es un valor válido, por ejemplo imagina JsonConvert.DeserializeObject<int>('2');

Pero a2 no es como probablemente lo vea como un identificador incompleto o una propiedad que no puede existir fuera de un objeto literal.No es una cadena ya que no hay comillas.

Básicamente, estás intentando que el analizador JSON analice JSON no válido, lo cual, por supuesto, no hará.

En tu caso, en realidad haría algo como esto:

MyClass cls = null;

if (json.StartsWith("{")) {
    cls = JsonConvert.DeserializeObject<MyClass>(json);
} else {
    cls = new MyClass() {
        Key = json
    };
}

Esto verifica {} con qué objetos deben comenzar/terminar.Si encontramos un { podemos asumir que es un objeto y deserializarlo; de lo contrario, creamos manualmente una instancia de su clase y completamos el valor.

Por supuesto, estoy haciendo algunas suposiciones aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top