我正在尝试从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();
}
}
答案 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.Name
和dt.Surname
未被序列化,而是null
。
(顺便说一句,由于这两个成员已经是字符串,因此无需在其上调用ToString()
。)