2016-05-14 8 views
3

私は単純なJSONをWCF Restクライアントで生成しましたが、応答を逆シリアル化しようとするとJSON.NetにエラーNullReferenceExceptionが発生します。私は、JSONを次ていますNewtonsoft json.net deserialization NullReferenceException

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

とクラス以下:

[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; } 
} 

その後、私はそれをデシリアライズ:

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

そしてSUBJエラーが発生します。新しいコンソールアプリケーションで再現されました。必要に応じて提供できます。 JSONは非常に単純ですが、なぜこのエラーが発生していますか?

サンプル:https://dotnetfiddle.net/76FJd0

スタックトレース:

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あなたは、マーキングの前に読んでいますか?私は定数である文字列を提供しました、あなたは空でない空白がnullであると思いますか? –

+0

トレースバックを含む、例外の完全な 'ToString()'出力は何ですか? – dbc

+1

@dbc編集を参照してください。また、提供されたフィドルを見たり、リアルタイムでコードを編集することもできます。 –

答えて

7

あなたのFileUploadErrorクラスにパブリック・パラメータなしのコンストラクタを追加する必要があります。

public class FileUploadError 
{ 
    public FileUploadError() 
    { 
    } 

それとも、あなたはそれをプライベートにすると[JsonConstructor]を使用することができます:

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

それとも、プライベートのままにしてConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructorをデシリアライズ:

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

で:

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

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

+0

素敵な属性です、ありがとうございます。それについて知らなかった。 –

+0

これは私の背中を何度も何度も刺し続けているようです。ありがとう! – Francis

関連する問題