2016-05-08 8 views
3

Ich habe dieses Array:Eingabezeichenfolge in keinem gültigen Zahl - JSON Deserialisierung

{ 
    "AssemblyVersion":"0.1.333.5973", 
    "Exception": 
    { 
     // [...] 
    } 
} 

, die aus dieser Klasse serialisiert wird:

public class ErrorData 
{ 
    public string AssemblyVersion { get; private set; } 
    public Exception Exception { get; private set; } 

    public ErrorData(string assemblyVersion, Exception ex) 
    { 
     AssemblyVersion = assemblyVersion; 
     Exception = ex; 
    } 

    public override string ToString() 
    { 
     return JsonConvert.SerializeObject(this); 
    } 
} 

es zurück zu einem Objekt erzeugt die folgende Ausnahme Serialisieren:

Newtonsoft.Json.JsonReaderException: Input string '0.1.335.5973' is not a valid number. Path 'AssemblyVersion', line 1, position 29. 
    at Newtonsoft.Json.JsonTextReader.ParseNumber(ReadType readType) 
    at Newtonsoft.Json.JsonTextReader.ReadStringValue(ReadType readType) 
    at Newtonsoft.Json.JsonTextReader.ReadAsString() 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolvePropertyAndCreatorValues(JsonObjectContract contract, JsonProperty containerProperty, JsonReader reader, Type objectType) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObjectUsingCreatorWithParameters(JsonReader reader, JsonObjectContract contract, JsonProperty containerProperty, ObjectConstructor`1 creator, String id) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject(JsonReader reader, JsonObjectContract objectContract, JsonProperty containerMember, JsonProperty containerProperty, String id, Boolean& createdFromNonDefaultCreator) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) 
    at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) 
    at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) 
    at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings) 
    at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value) 

Kurz gesagt serialisieren ich eine ErrorData-Instanz als eine JSON-Zeichenfolge mit dem Overridden ToString() Methode, wobei das Ergebnis als Befehlszeilenargument an einen untergeordneten Prozess übergeben wird, der es in eine ErrorData-Instanz deserialisiert.

Was fehlt mir? Es sieht so aus, als ob die AssemblyVersion-Zeichenfolge als Nummer anstelle einer Zeichenfolge angezeigt wird.

Edit:

ich es auf diese Weise bin Deserialisieren:

ErrorData errorData = JsonConvert.DeserializeObject<ErrorData>(args[0]); 

Serialisieren bereits im Code oben gezeigt wird, ich implementiert es in ToString() -Methode.

Ich kann überprüfen, dass es passiert, weil ich das Array als eine Befehlszeile arg übergeben. Dieser Code funktioniert:

ErrorData errorData = Json.DeserializeObject<ErrorData>(new ErrorData("", new Exception()).ToString()); 
+2

Können Sie den Code anzeigen, den Sie für die Serialisierung und Deserialisierung verwenden? –

+0

Was ist die vollständige 'ToString()' Ausgabe der Ausnahme einschließlich des Ausnahme-Typs, Nachricht, ** traceback in Json.NET ** und InnerException, falls vorhanden? – dbc

+0

@dbc Die ToString() -Methode löst keine Ausnahme aus. Es wird beim Deserialisieren in ein Objekt geworfen. Allerdings habe ich die volle Ausnahme hinzugefügt – chris579

Antwort

0

Ich schlage vor, dass Sie Ihre Eingabe überprüfen sollten, weil Code folgende Ausnahme über ungültige Nummer werfen:

JsonConvert.DeserializeObject<ErrorData>("{'AssemblyVersion':0.1.333.5973,'Exception':{}}"); 

Aber wenn Sie Assembly Wert notieren, dann wird der Deserialisierung gelingen:

JsonConvert.DeserializeObject<ErrorData>("{'AssemblyVersion':'0.1.333.5973','Exception':{}}"); 
Verwandte Themen