2016-05-10 2 views
1

私は、jsonファイルにメール設定を保存したいというアプリがあります。JsonConvert.DeserializeObject <T> nullを返す

JSONファイルは、次のようになります。

{ 
"Id": 1, 
"From": "[email protected]", 
"Password": "mypassword", 
"Port": 587, 
"To": "[email protected]", 
"SmtpAddress": "smtp.office365.com", 
"TargetName": "STARTTLS/smtp.office365.com" 
} 

とC#のコードは次のようになります。

public class EmailModel 
{ 
    [JsonProperty(nameof(Id))] 
    public int Id { get; set; } 
    [JsonProperty(nameof(To))] 
    public string To { get; set; } 
    [JsonProperty(nameof(From))] 
    public string From { get; set; } 
    [JsonProperty(nameof(Port))] 
    public int Port { get; set; } 
    [JsonProperty(nameof(Password))] 
    public string Password { get; set; } 
    [JsonProperty(nameof(SmtpAddress))] 
    public string SmtpAddress { get; set; } 
    [JsonProperty(nameof(TargetName))] 
    public string TargetName { get; set; } 
} 

と同じように見えアクセス:私はこのために多くの記事を見てきました

public EmailModel EmailModel(int id) 
{ 
    var filePath = AppDomain.CurrentDomain.BaseDirectory; 

    using (var sr = new StreamReader(Path.Combine(filePath,"appsettings.json"))) 
    { 
     string json = sr.ReadToEnd(); 
     return JsonConvert.DeserializeObject<EmailModel>(json); 
    } 
} 

しかし、どれもうまくいかないようです。私は追加しました

var settings = new JsonSerializerSettings(); 
settings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore; 

EmailModelクラスで、まだすべての私の値はnullのままです。

"{\r\n \"EmailModel\": {\r\n \"Id\": 1,\r\n \"From\": \"myemail\",\r\n \"Password\": \"myPassword\",\r\n \"Port\": 587,\r\n \"To\": \"myEmail\",\r\n \"SmtpAddress\": \"smtp.office365.com\",\r\n \"TargetName\": \"STARTTLS/smtp.office365.com\"\r\n }\r\n}\r\n" 

}

アップデート2:私は

からのコードを変更したとき Iはappsetting.jsonからの応答を取得し、私は sr.ReadToEnd()戻ることがわかり、この貫通

更新 デバッギング

var filePath = AppDomain.CurrentDomain.BaseDirectory; 
      var streamPath = Path.Combine(filePath, "appsettings.json"); 
      string json = null; 
      using (var sr = new StreamReader(streamPath)) 
      { 
       json = sr.ReadToEnd(); 

      } 

to:

 var json = @" 
      { 
      ""Id"": 1, 
      ""From"": ""myEmail"", 
      ""Password"": ""myPassword"", 
      ""Port"": 587, 
      ""To"": ""myEmail"", 
      ""SmtpAddress"": ""smtp.office365.com"", 
      ""TargetName"": ""STARTTLS/smtp.office365.com"" 
      }"; 

私のテストは失敗します。

+1

ファイルのパスは正しいですか?ファイルを見つけましたか? (つまり 'File.Exists(streamReader'sFilePath)'が 'true'を返すのですか?) – KAI

+1

jsonをファイルから読み込むのではなく文字列に入れ、' nameof'を静的な文字列に置き換えるようにコードを修正すると、良い。私はKAIが示唆しているように、ファイルが正しく読み込まれていることを確認したいと思います。特に、デシリアライズを呼び出す前にjsonの値を検証する価値があります。 jsonオブジェクトがまったくない場合は、nullを取得する必要があります。存在した場合でも、一致するプロパティーが1つもない場合でも、オブジェクトは戻され、ヌルではありません。 – Chris

+1

プロパティの名前がJsonプロパティと同じ場合、JsonProperty属性が設定されているのはなぜですか? – Gusman

答えて

2

コードを実行すると、 のデシリアライズ自体に問題はないことがわかります。

あなたがシーンの背後にある何かをしない限り。 これは作品:COMENTSが述べたように

private static void EmailModel() 
{ 
    var json = @" 
       { 
       ""Id"": 1, 
       ""From"": ""[email protected]"", 
       ""Password"": ""mypassword"", 
       ""Port"": 587, 
       ""To"": ""[email protected]"", 
       ""SmtpAddress"": ""smtp.office365.com"", 
       ""TargetName"": ""STARTTLS/smtp.office365.com"" 
       }"; 
    EmailModel result = null; 
    var settings = new JsonSerializerSettings(); 
    settings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore; 

    result = JsonConvert.DeserializeObject<EmailModel>(json, settings); 

    Console.WriteLine(result.From); 
} 

だから、あなたのファイルが存在し、指定したパスが正しいかどうかをチェックしてみてください。

UPDATE:

OPを更新した後、状況が変化し、来ているJSONは、ルート要素(EmailModel)が含まれ、それが直接シリアライズすることはできませんです。このpostには、より深い説明が含まれています。

まもなく、コードは仕事に、このように変更する必要があります

private static void EmailModel() 
    { 
     var json = "{\r\n \"EmailModel\": {\r\n \"Id\": 1,\r\n \"From\": \"myemail\",\r\n \"Password\": \"myPassword\",\r\n \"Port\": 587,\r\n \"To\": \"myEmail\",\r\n \"SmtpAddress\": \"smtp.office365.com\",\r\n \"TargetName\": \"STARTTLS/smtp.office365.com\"\r\n }\r\n}\r\n"; 

     JToken root = JObject.Parse(json); 
     JToken model = root["EmailModel"]; 

     var result = JsonConvert.DeserializeObject<EmailModel>(model.ToString()); 

     Console.WriteLine(result.From); 
    } 
+0

私は復帰を取り戻していますが、彼らはこのようには見えません。彼らは "{emailAddress:{...}}"を持っています。これを解析するのに役立つでしょうか? – JamTay317

+0

新しい行の文字をエスケープするレスポンスを変更できるかどうかは次の質問です。または、応答形式を変更することはできませんか? – 3615

+0

まあ、私は知らない、私の質問はまだnull値を取得していないと、しかし、JSsonは値を返しています。また、シミュレートしたあなたのjsonが機能しました。 – JamTay317

1

あなたのファイルが破損したデータが含まれています。 今では含まれています:それはそう、クラスを作成しない場合 :代わりに

{ 
    // ... 
    // properties here 
    // ... 
} 

更新

{ 
    EmailModel: 
    { 
     // ... 
     // properties here 
     // ... 
    } 
} 

public class EmailModelSerialize 
{ 
    public EmailModel EmailModel { get; set; } 
} 

このようシリアライズ:

EmailModelSerialize model; 
using (var sr = new StreamReader(Path.Combine(filePath, "appsettings.json"))) 
{ 
    string json = sr.ReadToEnd(); 
    model = JsonConvert.DeserializeObject<EmailModelSerialize>(json); 
} 
+0

はいそれはEmailModelを含んでいます:{...}私はappsetting.jsonを削除し、それを再作成しました。破損していない。 – JamTay317

+0

答えを更新しました。シリアル化プロセスで破損しているという意味です。もう一方のビューからは、ファイルはOKですが、シリアライズは「破損しました」。 :) – KAI

関連する問題