使用JSON.NET从文件中读取JSON - 无法将类型“Newtonsoft.Json.Linq.JToken”隐式转换为“string”

时间:2016-01-08 05:32:55

标签: c# json json.net

我正在尝试使用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文档,但我知道我错过了什么。请有人帮我指点正确的方向吗?

3 个答案:

答案 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("....");