Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从JSon文件提取数据时的空引用_C#_Json - Fatal编程技术网

C# 从JSon文件提取数据时的空引用

C# 从JSon文件提取数据时的空引用,c#,json,C#,Json,我试图从json文件中提取数据,但当我点击一个按钮时,它给出了一个NullReference异常,事实上json文件中有一个数据,但它仍然给出了一个异常 //Json File Starts With Name myfile [ {"Name" : "Stack" , "Surname" : "OverFlow"}, {"Name" : "Google", "Surname" : "INc"} ] //Json文件结束 [DataContract] class dt { public

我试图从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();

            }



    }
[DataContract]
类dt{
公共dt(){}
公共字符串名称{get;set;}
公共字符串姓氏{get;set;}
}
专用异步无效按钮\u单击(对象发送方,路由目标)
{
StorageFile sf=等待Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(@“Assets\myfile.txt”);
var dataString=await FileIO.ReadTextAsync(sf);
DataContractJsonSerializer json=新的DataContractJsonSerializer(typeof(List));
MemoryStream ms=新的MemoryStream(Encoding.UTF8.GetBytes(dataString));
List myData=(List)json.ReadObject(ms);
foreach(myData中的var dt)
{
Windows.UI.Popups.MessageDialog md=新的Windows.UI.Popups.MessageDialog(dt.Name.ToString()+“”+dt.Name.ToString());
等待md.ShowAsync();
}
}

您的问题在于您正在使用,而使用explicit的数据契约序列化是opt-in。这意味着要序列化的每个成员都必须标记为。从:

还可以使用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.nam姓
保留为
null


(顺便说一句,由于这两个成员已经是字符串,因此无需对它们调用
ToString()

在读取文件时,从顶部删除//注释会很有用,然后它就成为json有效字符串。回答得好。作为一个小小的补充:如果您不想使用
显式
属性,您也可以考虑使用可以通过Nuget安装的属性。