繁体   English   中英

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

[英]Null Reference On Extracting Data From JSon File

我正在尝试从 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();

            }



    }

您的问题是您使用的是DataContractJsonSerializer ,并且使用显式数据协定属性的数据协定序列化是可选的。 这意味着您要序列化的每个成员都必须用[DataMember]标记。 文档

您还可以使用 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() 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM