JsonConvert.DeserializeObject() 抛出 System.ArgumentNullException: 'Path cannot be null. Parameter name: path' 异常。为什么?
JsonConvert.DeserializeObject() throwing System.ArgumentNullException: 'Path cannot be null. Parameter name: path' exception. Why?
我的class结构如下:
class AppDetails
{
public String companyName { get; set; }
public String applicationName { get; set; }
public String version { get; set; }
public List<File_> fileObjectList { get; set; }
public AppDetails(String cName, String aName, String v)
{
companyName = cName;
applicationName = aName;
version = v;
}
}
class File_
{
public String filePath { get; set; }
public FileRecord fileRecord { get; set; }
public File_(String parent_, String filepath_, Boolean Ignored)
{
filePath = filepath_;
fileRecord = new FileRecord(parent_ + filePath, Ignored);
}
}
class FileRecord
{
public Boolean ignored { get; set; }
public String MD5Checksum { get; set; }
public int version { get; set; }
public FileRecord(String filePath, Boolean ignored_)
{
ignored = ignored_;
if (ignored)
{
MD5Checksum = null;
}
else
{
MD5Checksum = CalculateMD5(filePath);
version = 0;
}
}
static string CalculateMD5(string filePath)
{
var md5 = MD5.Create();
var stream = File.OpenRead(filePath);
var hash = md5.ComputeHash((System.IO.Stream)stream);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
我使用这些 class 生成了 Json 文件。但是当我尝试使用上述 JSON 文件初始化一个对象时,它会抛出 System.ArgumentNullException: 'Path cannot be null. Parameter name: path' 异常。
这是应该 return 对象的函数。
AppDetails ReadJsonFile()
{
using (StreamReader r = File.OpenText(parent + "\AllFilesList.json"))
{
string json = r.ReadToEnd();
var result = JsonConvert.DeserializeObject<AppDetails>(json);
return result;
}
}
我尝试使用在线 class 生成器从 JSON 生成 classes,它与我的 class 结构相匹配。此行抛出异常:
var result = JsonConvert.DeserializeObject<AppDetails>(json);
Json 字符串正在加载文件中的内容(从手表上可以看出)。我找不到任何与 JsonConvert.DeserializeObject 相关的路径问题。之前的大多数问题似乎都与值错误有关。
编辑:序列化代码
void JsonWriter(AppDetails appDetails, String filename)
{
string path = parent + "\" + filename + ".json";
File.Delete(path);
string json = JsonConvert.SerializeObject(appDetails);
using (var tw = new StreamWriter(path, true))
{
tw.WriteLine(json.ToString());
tw.Close();
}
}
示例Json 文件:
{"companyName":"Home","applicationName":"Test","version":"V5.0.1","fileObjectList":[{"filePath":"\bug-tracker.exe","fileRecord":{"ignored":false,"MD5Checksum":"a5254a813a040b429f2288df737a8b9f","version":0}},{"filePath":"\bug-tracker.exe.config","fileRecord":{"ignored":false,"MD5Checksum":"e5c3e9137dc8fadb57dfc27b0ba6855c","version":0}},{"filePath":"\bug-tracker.pdb","fileRecord":{"ignored":false,"MD5Checksum":"9a9dfda29dcaacae82cba7bd7aa97ffa","version":0}},{"filePath":"\Caliburn.Micro.dll","fileRecord":{"ignored":false,"MD5Checksum":"aa5f96c02b08d9b33322f3024058dd91","version":0}},{"filePath":"\Caliburn.Micro.Platform.Core.dll","fileRecord":{"ignored":false,"MD5Checksum":"ab7867bd44b59879a59b5cb968e15668","version":0}},{"filePath":"\Caliburn.Micro.Platform.Core.xml","fileRecord":{"ignored":false,"MD5Checksum":"cdfcbbf70a9a62b92e82a953ab9e7e30","version":0}},{"filePath":"\Caliburn.Micro.Platform.dll","fileRecord":{"ignored":false,"MD5Checksum":"a52bdecbc1b7625cb13c9385fad4231b","version":0}},{"filePath":"\Caliburn.Micro.Platform.xml","fileRecord":{"ignored":false,"MD5Checksum":"09f258a3aeca7285355d82a66dda2176","version":0}},{"filePath":"\Caliburn.Micro.xml","fileRecord":{"ignored":false,"MD5Checksum":"c87ec582a4bfcf2e79e517c689441def","version":0}},{"filePath":"\MaterialDesignColors.dll","fileRecord":{"ignored":false,"MD5Checksum":"ad729352a9088b889cc0c4dc7542dcb6","version":0}},{"filePath":"\MaterialDesignColors.pdb","fileRecord":{"ignored":false,"MD5Checksum":"7ba70b23e22db9ac155e190860d9a5ec","version":0}},{"filePath":"\MaterialDesignThemes.Wpf.dll","fileRecord":{"ignored":false,"MD5Checksum":"e4c790d3af41620dc5ad513ae7fcadac","version":0}},{"filePath":"\MaterialDesignThemes.Wpf.pdb","fileRecord":{"ignored":false,"MD5Checksum":"f8113c8ea54896b8150db8e7ebd506ef","version":0}},{"filePath":"\MaterialDesignThemes.Wpf.xml","fileRecord":{"ignored":false,"MD5Checksum":"49717f8130b7529ee51fb6bc13f79aa4","version":0}},{"filePath":"\ShowMeTheXAML.dll","fileRecord":{"ignored":false,"MD5Checksum":"040b9e80820553a55f13ac19c2036367","version":0}},{"filePath":"\System.Windows.Interactivity.dll","fileRecord":{"ignored":false,"MD5Checksum":"580244bc805220253a87196913eb3e5e","version":0}}]}
编辑 2:Json 来自手表的字符串
"{\"companyName\":\"Home\",\"applicationName\":\"Test\",\"version\":\"V5.0.1\",\"fileObjectList\":[{\"filePath\":\"\\bug-tracker.exe\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"a5254a813a040b429f2288df737a8b9f\",\"version\":0}},{\"filePath\":\"\\bug-tracker.exe.config\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"e5c3e9137dc8fadb57dfc27b0ba6855c\",\"version\":0}},{\"filePath\":\"\\bug-tracker.pdb\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"9a9dfda29dcaacae82cba7bd7aa97ffa\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"aa5f96c02b08d9b33322f3024058dd91\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.Platform.Core.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"ab7867bd44b59879a59b5cb968e15668\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.Platform.Core.xml\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"cdfcbbf70a9a62b92e82a953ab9e7e30\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.Platform.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"a52bdecbc1b7625cb13c9385fad4231b\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.Platform.xml\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"09f258a3aeca7285355d82a66dda2176\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.xml\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"c87ec582a4bfcf2e79e517c689441def\",\"version\":0}},{\"filePath\":\"\\MaterialDesignColors.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"ad729352a9088b889cc0c4dc7542dcb6\",\"version\":0}},{\"filePath\":\"\\MaterialDesignColors.pdb\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"7ba70b23e22db9ac155e190860d9a5ec\",\"version\":0}},{\"filePath\":\"\\MaterialDesignThemes.Wpf.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"e4c790d3af41620dc5ad513ae7fcadac\",\"version\":0}},{\"filePath\":\"\\MaterialDesignThemes.Wpf.pdb\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"f8113c8ea54896b8150db8e7ebd506ef\",\"version\":0}},{\"filePath\":\"\\MaterialDesignThemes.Wpf.xml\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"49717f8130b7529ee51fb6bc13f79aa4\",\"version\":0}},{\"filePath\":\"\\ShowMeTheXAML.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"040b9e80820553a55f13ac19c2036367\",\"version\":0}},{\"filePath\":\"\\System.Windows.Interactivity.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"580244bc805220253a87196913eb3e5e\",\"version\":0}}]}\r\n"
实际问题是您的构造函数中有参数:
public FileRecord(String filePath, Boolean ignored_)
并且 JsonConvert 将默认值放在那里 (null, false) 触发代码:
else
{
MD5Checksum = CalculateMD5(filePath);
version = 0;
}
它依次尝试使用 null 路径参数从文件中读取:
static string CalculateMD5(string filePath)
{
var md5 = MD5.Create();
var stream = File.OpenRead(filePath); // <- HERE!!!!
var hash = md5.ComputeHash((System.IO.Stream)stream);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
我看到有两个解决方案
创建无参数构造函数,根据需要初始化所有内容,或者使用 :this() 和默认值调用带有参数的构造函数:
public 文件记录():这个(空,真)
{
}
重命名属性以匹配参数名称,例如:
public bool Ignored { get; set; }
public FileRecord(string filePath, bool ignored)
{
this.Ingnoerd = ignored;
....
}
我的class结构如下:
class AppDetails
{
public String companyName { get; set; }
public String applicationName { get; set; }
public String version { get; set; }
public List<File_> fileObjectList { get; set; }
public AppDetails(String cName, String aName, String v)
{
companyName = cName;
applicationName = aName;
version = v;
}
}
class File_
{
public String filePath { get; set; }
public FileRecord fileRecord { get; set; }
public File_(String parent_, String filepath_, Boolean Ignored)
{
filePath = filepath_;
fileRecord = new FileRecord(parent_ + filePath, Ignored);
}
}
class FileRecord
{
public Boolean ignored { get; set; }
public String MD5Checksum { get; set; }
public int version { get; set; }
public FileRecord(String filePath, Boolean ignored_)
{
ignored = ignored_;
if (ignored)
{
MD5Checksum = null;
}
else
{
MD5Checksum = CalculateMD5(filePath);
version = 0;
}
}
static string CalculateMD5(string filePath)
{
var md5 = MD5.Create();
var stream = File.OpenRead(filePath);
var hash = md5.ComputeHash((System.IO.Stream)stream);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
我使用这些 class 生成了 Json 文件。但是当我尝试使用上述 JSON 文件初始化一个对象时,它会抛出 System.ArgumentNullException: 'Path cannot be null. Parameter name: path' 异常。 这是应该 return 对象的函数。
AppDetails ReadJsonFile()
{
using (StreamReader r = File.OpenText(parent + "\AllFilesList.json"))
{
string json = r.ReadToEnd();
var result = JsonConvert.DeserializeObject<AppDetails>(json);
return result;
}
}
我尝试使用在线 class 生成器从 JSON 生成 classes,它与我的 class 结构相匹配。此行抛出异常:
var result = JsonConvert.DeserializeObject<AppDetails>(json);
Json 字符串正在加载文件中的内容(从手表上可以看出)。我找不到任何与 JsonConvert.DeserializeObject 相关的路径问题。之前的大多数问题似乎都与值错误有关。
编辑:序列化代码
void JsonWriter(AppDetails appDetails, String filename)
{
string path = parent + "\" + filename + ".json";
File.Delete(path);
string json = JsonConvert.SerializeObject(appDetails);
using (var tw = new StreamWriter(path, true))
{
tw.WriteLine(json.ToString());
tw.Close();
}
}
示例Json 文件:
{"companyName":"Home","applicationName":"Test","version":"V5.0.1","fileObjectList":[{"filePath":"\bug-tracker.exe","fileRecord":{"ignored":false,"MD5Checksum":"a5254a813a040b429f2288df737a8b9f","version":0}},{"filePath":"\bug-tracker.exe.config","fileRecord":{"ignored":false,"MD5Checksum":"e5c3e9137dc8fadb57dfc27b0ba6855c","version":0}},{"filePath":"\bug-tracker.pdb","fileRecord":{"ignored":false,"MD5Checksum":"9a9dfda29dcaacae82cba7bd7aa97ffa","version":0}},{"filePath":"\Caliburn.Micro.dll","fileRecord":{"ignored":false,"MD5Checksum":"aa5f96c02b08d9b33322f3024058dd91","version":0}},{"filePath":"\Caliburn.Micro.Platform.Core.dll","fileRecord":{"ignored":false,"MD5Checksum":"ab7867bd44b59879a59b5cb968e15668","version":0}},{"filePath":"\Caliburn.Micro.Platform.Core.xml","fileRecord":{"ignored":false,"MD5Checksum":"cdfcbbf70a9a62b92e82a953ab9e7e30","version":0}},{"filePath":"\Caliburn.Micro.Platform.dll","fileRecord":{"ignored":false,"MD5Checksum":"a52bdecbc1b7625cb13c9385fad4231b","version":0}},{"filePath":"\Caliburn.Micro.Platform.xml","fileRecord":{"ignored":false,"MD5Checksum":"09f258a3aeca7285355d82a66dda2176","version":0}},{"filePath":"\Caliburn.Micro.xml","fileRecord":{"ignored":false,"MD5Checksum":"c87ec582a4bfcf2e79e517c689441def","version":0}},{"filePath":"\MaterialDesignColors.dll","fileRecord":{"ignored":false,"MD5Checksum":"ad729352a9088b889cc0c4dc7542dcb6","version":0}},{"filePath":"\MaterialDesignColors.pdb","fileRecord":{"ignored":false,"MD5Checksum":"7ba70b23e22db9ac155e190860d9a5ec","version":0}},{"filePath":"\MaterialDesignThemes.Wpf.dll","fileRecord":{"ignored":false,"MD5Checksum":"e4c790d3af41620dc5ad513ae7fcadac","version":0}},{"filePath":"\MaterialDesignThemes.Wpf.pdb","fileRecord":{"ignored":false,"MD5Checksum":"f8113c8ea54896b8150db8e7ebd506ef","version":0}},{"filePath":"\MaterialDesignThemes.Wpf.xml","fileRecord":{"ignored":false,"MD5Checksum":"49717f8130b7529ee51fb6bc13f79aa4","version":0}},{"filePath":"\ShowMeTheXAML.dll","fileRecord":{"ignored":false,"MD5Checksum":"040b9e80820553a55f13ac19c2036367","version":0}},{"filePath":"\System.Windows.Interactivity.dll","fileRecord":{"ignored":false,"MD5Checksum":"580244bc805220253a87196913eb3e5e","version":0}}]}
编辑 2:Json 来自手表的字符串
"{\"companyName\":\"Home\",\"applicationName\":\"Test\",\"version\":\"V5.0.1\",\"fileObjectList\":[{\"filePath\":\"\\bug-tracker.exe\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"a5254a813a040b429f2288df737a8b9f\",\"version\":0}},{\"filePath\":\"\\bug-tracker.exe.config\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"e5c3e9137dc8fadb57dfc27b0ba6855c\",\"version\":0}},{\"filePath\":\"\\bug-tracker.pdb\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"9a9dfda29dcaacae82cba7bd7aa97ffa\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"aa5f96c02b08d9b33322f3024058dd91\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.Platform.Core.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"ab7867bd44b59879a59b5cb968e15668\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.Platform.Core.xml\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"cdfcbbf70a9a62b92e82a953ab9e7e30\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.Platform.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"a52bdecbc1b7625cb13c9385fad4231b\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.Platform.xml\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"09f258a3aeca7285355d82a66dda2176\",\"version\":0}},{\"filePath\":\"\\Caliburn.Micro.xml\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"c87ec582a4bfcf2e79e517c689441def\",\"version\":0}},{\"filePath\":\"\\MaterialDesignColors.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"ad729352a9088b889cc0c4dc7542dcb6\",\"version\":0}},{\"filePath\":\"\\MaterialDesignColors.pdb\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"7ba70b23e22db9ac155e190860d9a5ec\",\"version\":0}},{\"filePath\":\"\\MaterialDesignThemes.Wpf.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"e4c790d3af41620dc5ad513ae7fcadac\",\"version\":0}},{\"filePath\":\"\\MaterialDesignThemes.Wpf.pdb\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"f8113c8ea54896b8150db8e7ebd506ef\",\"version\":0}},{\"filePath\":\"\\MaterialDesignThemes.Wpf.xml\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"49717f8130b7529ee51fb6bc13f79aa4\",\"version\":0}},{\"filePath\":\"\\ShowMeTheXAML.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"040b9e80820553a55f13ac19c2036367\",\"version\":0}},{\"filePath\":\"\\System.Windows.Interactivity.dll\",\"fileRecord\":{\"ignored\":false,\"MD5Checksum\":\"580244bc805220253a87196913eb3e5e\",\"version\":0}}]}\r\n"
实际问题是您的构造函数中有参数:
public FileRecord(String filePath, Boolean ignored_)
并且 JsonConvert 将默认值放在那里 (null, false) 触发代码:
else
{
MD5Checksum = CalculateMD5(filePath);
version = 0;
}
它依次尝试使用 null 路径参数从文件中读取:
static string CalculateMD5(string filePath)
{
var md5 = MD5.Create();
var stream = File.OpenRead(filePath); // <- HERE!!!!
var hash = md5.ComputeHash((System.IO.Stream)stream);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
我看到有两个解决方案
创建无参数构造函数,根据需要初始化所有内容,或者使用 :this() 和默认值调用带有参数的构造函数:
public 文件记录():这个(空,真) { }
重命名属性以匹配参数名称,例如:
public bool Ignored { get; set; } public FileRecord(string filePath, bool ignored) { this.Ingnoerd = ignored; .... }