使用正在加载到observablecollection中的JSON数据获得一些奇怪的行为。
以下是JSON导入的示例,以及我的文件夹路径的显示方式。
{
"projectNumber":"16000",
"projectName":"Sample Project",
"Directory":"@\"C:\\Users\"", }
到目前为止,我已经能够在加载到我的observablecollection后按预期使用数据。例如,消息框按预期在消息框中显示(selectedfolder):@" C:\ Users"
这是我希望我的树视图使用的路径。奇怪的是,它没有使用它,而是使用我的JSON导入中的原始路径格式(" @ \" C:\ Users \"")并抛出"路径中的非法字符"错误。
private void ListDirectory(TreeView treeView, string path)
{
treeView.Items.Clear();
var rootDirectoryInfo = new DirectoryInfo(path);
treeView.Items.Add(CreateDirectoryNode(rootDirectoryInfo));
}
private static TreeViewItem CreateDirectoryNode(DirectoryInfo directoryInfo)
{
var directoryNode = new TreeViewItem { Header = directoryInfo.Name };
foreach (var directory in directoryInfo.GetDirectories())
directoryNode.Items.Add(CreateDirectoryNode(directory));
foreach (var file in directoryInfo.GetFiles())
directoryNode.Items.Add(new TreeViewItem { Header = file.Name });
return directoryNode;
}
private void button_Click(object sender, RoutedEventArgs e)
{
Project selectedProject = comboBox.SelectedItem as Project;
selectedfolder = selectedProject.Directory.ToString();
MessageBox.Show(selectedfolder);
if (selectedProject != null)
{
this.ListDirectory(treeView, selectedfolder);
}
任何人都会看到我在这里丢失的内容,以及为什么相同的字符串会根据其使用方式而有所不同?
答案 0 :(得分:3)
@""
字符串文字用于帮助编写包含带反斜杠的字符串的代码。例如,这段代码包含对有效路径的引用,而@""
位只是告诉C#编译器以不同于普通C风格字符串的方式处理反斜杠:
string example1 = @"C:\Users";
Debug.WriteLine(example1); // Outputs C:\Users
// This works
var temp1 = new DirectoryInfo(example1);
将@""
位实际嵌入字符串后,最终会得到一个包含@
和"
个字符的字符串,这个字符不会有效Windows上的路径。
string example2 = "@\"C:\\Users\"";
Debug.WriteLine(example2); // Outputs @"C:\Users"
// This throws an exception
var temp2 = new DirectoryInfo(example2);
换句话说:使用@""
对于C#代码来说很好,但是对于JSON对象,您需要使用\
来转义字符,将JSON文本更改为此类型,所以它是JSON反序列化器完成解析字符串后的有效路径:
{
"projectNumber":"16000",
"projectName":"Sample Project",
"Directory":"C:\\Users",
}
答案 1 :(得分:0)
这显然是答案。非常感谢,Anon!什么让我失望的是字符串如何在消息框中显示我将如何在路径引用中使用它。新手的错误!