从JSon文件中提取数据的空引用

时间:2016-03-15 07:21:11

标签: c# json

我正在尝试从json文件中提取数据但是当我点击一个按钮时它会给出NullReference的一个例外,实际上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();

            }



    }

1 个答案:

答案 0 :(得分: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()。)