如何更改JObject中嵌套属性的值?



我有一个配置。Json,看起来像这样:

{
"Field": {
"FieldKey1": "FieldValue1",
"FieldKey2": "FieldValue2"
},
"List": [
"ListEntry1",
"ListEntry2"
],
"UnnestedKey": "UnnestedValue"
}

我可以通过以下方式读取访问嵌套的值:

var x = await ConfigUtils.Get(configPath, "Field.FieldKey1");
Console.WriteLine(x.ToString());

:

using Newtonsoft.Json;
public static async Task<JToken> Get(string filePath, string key)
{
JObject jObject = await GetJObject(filePath);

return jObject.SelectToken(key)
?? throw new KeyNotFoundException($"Key "{key}" doesn't exist in {filePath}.");
}

private static async Task<JObject> GetJObject(string filePath)
{
string jsonString = await File.ReadAllTextAsync(filePath);

JObject jObject = JObject.Parse(jsonString);

return jObject;
}

正确打印&;fieldvalue1 &;

然而,我不知道如何改变一个嵌套的值在config.json。如果我尝试:

await ConfigUtils.UpdateValue(configPath, "Field.FieldKey1", "NewValue");

:

using Newtonsoft.Json;
public static async Task UpdateValue(string filePath, string key, string value)
{
JObject jObject = await GetJObject(filePath);
jObject.AddOrReplace(key, value);
await WriteJObject(jObject, filePath);
}

添加一个新的未嵌套键Field.FieldKey1list,而不是改变FieldFieldKey1的值。

我如何修改我的UpdateValue方法工作的嵌套值?我知道我可能不得不在我的Get方法中使用jObject.SelectToken(key),但我不知道如何从那里去,我无望地困惑关于JToken, JProperty, JObject。

您可以在找到的令牌上使用ReplaceJToken.FromObject来创建一个新值:

var js = """
{
"Field": {
"FieldKey1": "FieldValue1",
"FieldKey2": "FieldValue2"
},
"List": [
"ListEntry1",
"ListEntry2"
],
"UnnestedKey": "UnnestedValue"
}
""";
var jObject = JObject.Parse(js);
var selectToken = jObject.SelectToken("Field.FieldKey1");
selectToken.Replace(JToken.FromObject("NewValue"));
Console.WriteLine(JsonConvert.SerializeObject(jObject)); // {"Field":{"FieldKey1":"NewValue","FieldKey2":"FieldValue2"},"List":["ListEntry1","ListEntry2"],"UnnestedKey":"UnnestedValue"}

更新配置中的嵌套值。如果是json,则需要使用SelectToken方法获取表示嵌套值的JToken,然后更新该JToken的值。

public static async Task UpdateValue(string filePath, string key, string value)
{
JObject jObject = await GetJObject(filePath);
JToken token = jObject.SelectToken(key);
JProperty property = (JProperty)token;
property.Value = value;

await WriteJObject(jObject, filePath);
}

最新更新