Use JsonConvert.DeserializeObject quando a string de entrada não for Json válida e for ou começar com um número

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

Pergunta

Quero encontrar uma boa solução para lidar com a desserialização de strings simples que começam com um número ou contêm apenas um número e entender por que isso não funciona como está agora.

Não posso controlar as strings de entrada, então não posso confiar que elas sejam Json válidas e, no momento, estou apenas verificando se é Json e, se não for, colocarei em "[{}] ", mas eu queria ver se havia uma maneira melhor.

É assim que estou desserializando:

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

Minha classe tem duas propriedades:

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

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

Se a string de entrada for apenas "a" ou "a2", ela lançará uma Newtonsoft.Json.JsonException ("Caractere inesperado encontrado ao analisar o valor:a.Caminho '', linha 0, posição 0.") que é esperado, porém "2" e "2a" geram outros erros.Gostaria do mesmo comportamento para "2" e "2a" e para "a" e "a2".

Exceção ao passar "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[].

Exceção ao passar "2a":

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

Por que não funciona quando a string contém apenas números ou começa com um número?Existe uma maneira mais inteligente de corrigir isso do que agrupar a string de entrada com "[{}]"?

Foi útil?

Solução

Seu problema decorre do analisador JSON e do que você está passando.

2 é um valor válido, por exemplo imagine JsonConvert.DeserializeObject<int>('2');

Mas a2 provavelmente não é visto como um identificador ou propriedade incompleta que não pode existir fora de um objeto literal.Não é uma string, pois não há aspas.

Você está basicamente tentando fazer com que o analisador JSON analise JSON inválido, o que não acontecerá, é claro.

No seu caso, eu realmente faria algo assim:

MyClass cls = null;

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

Isso verifica {} com quais objetos devem começar/terminar.Se encontrarmos um { podemos assumir que é um objeto e desserializar, caso contrário, criamos manualmente uma instância da sua classe e preenchemos o valor.

É claro que estou fazendo algumas suposições aqui.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top