我正在尝试使用JSON.NET从文件中读取以下JSON。
{
"SendTelemetry": true
}
但是,我在解析数据方面遇到了一些问题。这是我到目前为止所拥有的。
public class SettingsStore
{
[JsonProperty]
public bool SendTelemetry { get; set; }
public dynamic ReadJsonFile(string filePath)
{
if (string.IsNullOrEmpty(filePath)) { throw new ArgumentNullException("filePath"); }
if (!File.Exists(filePath))
{
throw new FileNotFoundException(string.Format(@"JSON settings file not found at [{0}]", filePath));
}
return JsonConvert.DeserializeObject(File.ReadAllText(filePath));
}
public void WriteJsonFile(string fileDirectory, string filePath, string json)
{
if (!Directory.Exists(fileDirectory))
{
Directory.CreateDirectory(fileDirectory);
}
File.WriteAllText(filePath, json);
}
}
var rootDir = Environment.ExpandEnvironmentVariables(@"%localappdata%\LigerShark\SideWaffle\");
var filePath = Path.Combine(rootDir, "SideWaffle-Settings.json");
settings = new SettingsStore();
string json = settings.ReadJsonFile(filePath);
bool telemetry = JsonConvert.DeserializeObject<SettingsStore>(json.ToString()).SendTelemetry;
当它到了反序列化json的时候我得到错误Cannot implicitly convert type 'Newtonsoft.Json.Linq.JToken' to 'string'. An explicit conversion exists (are you missing a cast?)
我一直在浏览JSON.NET文档,但我知道我错过了什么。请有人帮我指点正确的方向吗?
答案 0 :(得分:1)
看起来您正在调用JsonConvert.DeserializeObject()
两次 - 一次在ReadJsonFile()
,一次在底部的代码中。你应该只需要调用一次,这样我就可以完成对settings.ReadJsonFile()
的调用,而不是:{/ p>
bool telemetry = JsonConvert.DeserializeObject<SettingsStore>(File.ReadAllText(filePath)).SendTelemetry;
(当然,如果您愿意,可以将其移到方法中,以便在filePath
上添加支票)
答案 1 :(得分:1)
ReadJsonFile
正在返回JToken
,因为您已经反序列化该对象。
将您的代码更改为:
public class SettingsStore
{
[JsonProperty]
public bool SendTelemetry { get; set; }
public static SettingsStore ReadJsonFile(string filePath)
{
if (string.IsNullOrEmpty(filePath)) { throw new ArgumentNullException("filePath"); }
if (!File.Exists(filePath))
{
throw new FileNotFoundException(string.Format(@"JSON settings file not found at [{0}]", filePath));
}
return JsonConvert.DeserializeObject<SettingsStore>(File.ReadAllText(filePath));
}
public void WriteJsonFile(string fileDirectory, string filePath, string json)
{
if (!Directory.Exists(fileDirectory))
{
Directory.CreateDirectory(fileDirectory);
}
File.WriteAllText(filePath, json);
}
}
然后:
var rootDir = Environment.ExpandEnvironmentVariables(@"%localappdata%\LigerShark\SideWaffle\");
var filePath = Path.Combine(rootDir, "SideWaffle-Settings.json");
var settingsStore = SettingsStore.ReadJsonFile(filePath);
bool telemetry = settingsStore.SendTelemetry;
答案 2 :(得分:1)
您遇到问题的原因是,如果您没有投放结果,请返回JToken
。
我建议稍微更改您的方法,让ReadJsonFile
返回SettingsStore
的实例,此方法为static
(如果您要创建新对象,则不需要实例)。
这样的事情看起来应该可以解决问题。
public class SettingsStore
{
[JsonProperty]
public bool SendTelemetry { get; set; }
public static SettingsStore ReadJsonFile(string filePath)
{
if (string.IsNullOrEmpty(filePath)) { throw new ArgumentNullException("filePath"); }
if (!File.Exists(filePath))
{
throw new FileNotFoundException(string.Format(@"JSON settings file not found at [{0}]", filePath));
}
return JsonConvert.DeserializeObject<SettingsStore>(File.ReadAllText(filePath));
}
public void WriteJsonFile(string fileDirectory, string filePath, string json)
{
if (!Directory.Exists(fileDirectory))
{
Directory.CreateDirectory(fileDirectory);
}
File.WriteAllText(filePath, json);
}
}
使用。
可以在一行中轻松调用var settings = SettingsStore.ReadJsonFile("....");