2016-05-14 2 views
3

Ich habe eine einfache JSON mit WCF Rest Client generiert, aber wenn ich versuche, eine Antwort deserialize ich bekomme einen Fehler NullReferenceException in JSON.Net. Ich habe folgende JSON:Newtonsoft json.net Deserialisierung NullReferenceException

{"Code":-2146232800,"ExceptionType":"IOException","Message":"Msg","Stacktrace":"Some"} 

Und folgende Klasse:

[DataContract] 
public class FileUploadError 
{ 
    public FileUploadError(Exception exception) 
    { 
     Code = exception.HResult; 
     ExceptionType = exception.GetType().Name; 
     Message = GetMessage(exception); 
     Stacktrace = exception.StackTrace; 
     if (exception.Data.Count > 0) 
     { 
      Data = string.Join(Environment.NewLine, exception.Data.Cast<DictionaryEntry>().Select(x => x.Key + "=" + x.Value)); 
     } 
    } 

    private string GetMessage(Exception exception) 
    { 
     if (exception.InnerException == null) 
     { 
      return exception.Message; 
     } 
     const string delimiter = "->"; 
     var sb = new StringBuilder(1024); 
     for (var ex = exception; ex != null; ex = ex.InnerException) 
     { 
      sb.Append(ex.Message).Append(delimiter); 
     } 
     sb.Length -= delimiter.Length; 
     return sb.ToString(); 
    } 

    [DataMember(IsRequired = true)] 
    [JsonProperty("Code", NullValueHandling = NullValueHandling.Ignore)] 
    public int Code { get; set; } 
    [DataMember(IsRequired = true)] 
    [JsonProperty("ExceptionType", NullValueHandling = NullValueHandling.Ignore)] 
    public string ExceptionType { get; set; } 
    [DataMember(EmitDefaultValue = false)] 
    [JsonProperty("Message", NullValueHandling = NullValueHandling.Ignore)] 
    public string Message { get; set; } 
    [DataMember(EmitDefaultValue = false)] 
    [JsonProperty("Stacktrace", NullValueHandling = NullValueHandling.Ignore)] 
    public string Stacktrace { get; set; } 
    [DataMember(EmitDefaultValue = false)] 
    [JsonProperty("Data", NullValueHandling = NullValueHandling.Ignore)] 
    public string Data { get; set; } 
} 

Dann habe ich deserialisieren es:

const string text = "{\"Code\":-2146232800,\"ExceptionType\":\"IOException\",\"Message\":\"Msg\",\"Stacktrace\":\"Some\"}"; 
var obj = JsonConvert.DeserializeObject<FileUploadError>(text); 

Und subj Fehler. Reproduziert in neuer Konsolenanwendung, die ich bei Bedarf bereitstellen kann. JSON ist sehr einfach, warum bekomme ich diesen Fehler?

Probe: https://dotnetfiddle.net/76FJd0

Stacktrace:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object. 
    at FileUploadError..ctor(Exception exception) in d:\Windows\Temp\nclgvim3.0.cs:line 28 
    --- End of inner exception stack trace --- 
    at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) 
    at System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.Reflection.ConstructorInfo.Invoke(Object[] parameters) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObjectFromNonDefaultConstructor(JsonReader reader, JsonObjectContract contract, JsonProperty containerProperty, ConstructorInfo constructorInfo, String id) 
    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 Program.Main(String[] args) 
+0

@Nasreddine lesen Sie vor der Markierung? Ich habe eine konstante Zeichenfolge geliefert. Denkst du, dass konstantes nicht-leeres Strong null sein kann? –

+0

Was ist die vollständige 'ToString()' Ausgabe der Ausnahme, einschließlich der Traceback? – dbc

+1

@dbc siehe bearbeiten, bitte. Sie können auch die mitgelieferte Geige anschauen und den Code in Echtzeit bearbeiten. –

Antwort

7

Sie benötigen einen öffentlichen parameterlosen Konstruktor auf Ihre FileUploadError Klasse hinzuzufügen:

public class FileUploadError 
{ 
    public FileUploadError() 
    { 
    } 

Oder könnten Sie es privat machen und [JsonConstructor] verwenden :

public class FileUploadError 
{ 
    [JsonConstructor] 
    private FileUploadError() 
    { 
    } 

Oder lassen Sie es privat und deserialisieren mit ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor:

var settings = new JsonSerializerSettings 
{ 
    ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor 
}; 
var obj = JsonConvert.DeserializeObject<FileUploadError>(text, settings); 

mit:

public class FileUploadError 
{ 
    private FileUploadError() 
    { 
    } 
+2

[Beweis] (https://dotnetfiddle.net/L2Nujl) –

+0

Wunderbares Attribut, danke. Ich wusste nichts davon. –

+0

Dieser scheint mich immer wieder in den Hintern zu beißen. Vielen Dank! – Francis