2016-03-15 102 views
2

我試圖從json文件中提取數據,但是當我點擊一個按鈕時,它會給出NullReference的異常,實際上在json文件中有一個數據,但它仍然會發出異常。從JSon文件中提取數據的空參考

//Json File Starts With Name myfile 
[ 
{"Name" : "Stack" , "Surname" : "OverFlow"}, 
{"Name" : "Google", "Surname" : "INc"} 
] 

// JSON文件結束

[DataContract] 
class dt { 
    public dt(){} 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 

    private async void Button_Click(object sender, RoutedEventArgs e) 
    { 
     StorageFile sf = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(@"Assets\myfile.txt"); 
     var dataString = await FileIO.ReadTextAsync(sf); 
     DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(List<dt>)); 
     MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(dataString)); 
     List<dt> myData = (List<dt>)json.ReadObject(ms); 


      foreach (var dt in myData) 
      { 

        Windows.UI.Popups.MessageDialog md = new Windows.UI.Popups.MessageDialog(dt.Name.ToString() +" "+ dt.Surname.ToString()); 
        await md.ShowAsync(); 

      } 



    } 
+0

隨着你讀它是隻刪除從頂部//註釋那麼有用的文件成爲json有效的字符串。 – AliK

回答

2

你的問題是,你正在使用DataContractJsonSerializer,並且使用明確data contract attributes被選擇加入數據合同序列化。這意味着每個想要序列化的成員都必須標記爲[DataMember]。從docs

您還可以使用DataContractAttribute和DataMemberAttribute屬性顯式創建數據協定。這通常通過將DataContractAttribute屬性應用於該類型來完成。該屬性可以應用於類,結構和枚舉。必須將DataMemberAttribute屬性應用於數據協定類型的每個成員,以表明它是數據成員,也就是說,它應該被序列化。

因此您dt類必須是這樣的:

[DataContract] 
class dt { 
    public dt(){} 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public string Surname { get; set; } 
} 

你所得到的空引用,因爲dt.Namedt.Surname,不被序列化,留下null

(順便說一句,因爲這兩個成員是已經串,沒有必要打電話給ToString()他們。)

+0

很好的答案。就像一個小小的補充:如果你不想使用'explicit'屬性,你也可以考慮使用[Json.NET Newtonsoft](http://www.newtonsoft.com/json),它可以通過Nuget安裝。 –

+0

非常感謝你的工作...... :) –