Utilizzare JSONCONVERT.DESeriaLizeSobject quando l'ingresso String non è valido JSON ed è o inizia con un numero

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

Domanda

Voglio trovare una buona soluzione per gestire le stringhe normali che iniziano con un numero o contiene solo un numero e capisco perché non funziona come ora.

Non riesco a controllare le stringhe di input in modo che non riesco a fare affidamento su di loro essere valido JSON, e al momento sto solo controllando se è JSON e se non lo avvolgerò in "[ {}] ", Ma volevo vedere se c'era un modo migliore.

È così che sto diserializzando:

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

La mia classe ha due proprietà:

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

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

Se la stringa di input è solo "A" o "A2" lancia un newtonsoft.json.jsonexception ("Carattere imprevisto incontrato durante il valore di analisi: A. Path", linea 0, posizione 0 ") che è previsto , tuttavia "2" e "2a" getta altri errori. Vorrei lo stesso comportamento per "2" e "2a" come per "A" e "A2".

Eccezione quando si passa in "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[].
.

Eccezione quando si passa in "2a":

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

Perché non funziona quando la stringa contiene solo numeri o inizia con un numero? C'è un modo più intelligente per fissarlo che avvolgere la stringa di input con "[{}]"?

È stato utile?

Soluzione

Il tuo problema deriva dal parser JSON e cosa lo stai passando.

2 è un valore valido, ad esempio Immaginare JsonConvert.DeserializeObject<int>('2');

Ma a2 non è così probabile che lo veda come identificatore o proprietà incompleta che non può esistere al di fuori di un oggetto letterale.Non è una stringa perché non ci sono citazioni racchiudenti.

Stai praticamente cercando di ottenere il parser JSON per analizzare JSON non valido, che non farà ovviamente.

Nel tuo caso, avrei effettivamente qualcosa del genere:

MyClass cls = null;

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

Questo controlli per {} che gli oggetti dovrebbero iniziare / terminare con.Se troviamo un { possiamo assumere che sia un oggetto e deseriabilizzare, se non creiamo manualmente un'istanza della tua classe e compiliamo il valore.

Sono ovviamente a fare alcune ipotesi qui.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top