下面ExtensionMethods
可以帮助您在任何级别更新 json 中的任何键值。
public static class JsonExtensions
{
public static void SetByPath(this JToken obj, string path, JToken value)
{
JToken token = obj.SelectToken(path);
token.Replace(value);
}
public static List<JToken> FindTokens(this JToken containerToken, string name)
{
List<JToken> matches = new List<JToken>();
FindTokens(containerToken, name, matches);
return matches;
}
private static void FindTokens(JToken containerToken, string name, List<JToken> matches)
{
if (containerToken.Type == JTokenType.Object)
{
foreach (JProperty child in containerToken.Children<JProperty>())
{
if (child.Name == name)
{
matches.Add(child.Value);
}
FindTokens(child.Value, name, matches);
}
}
else if (containerToken.Type == JTokenType.Array)
{
foreach (JToken child in containerToken.Children())
{
FindTokens(child, name, matches);
}
}
}
}
在这里,我编写了一个自定义函数来查找键并替换它的值,
public static JToken FindAndReplace(JToken jToken, string key, JToken value, int? occurence)
{
var searchedTokens = jToken.FindTokens(key);
int count = searchedTokens.Count;
if (count == 0)
return $"The key you have to serach is not present in json, Key: {key}";
foreach (JToken token in searchedTokens)
{
if (!occurence.HasValue)
jToken.SetByPath(token.Path, value);
else
if (occurence.Value == searchedTokens.IndexOf(token))
jToken.SetByPath(token.Path, value);
}
return jToken;
}
重要的:第四个参数是什么occurence
意思是这里?
- 如果你把
null
在此参数中,对于任何级别的 json 中指定键的所有出现,该值都将更新。
- 如果你放置任何索引
0
, 1
那么该值将在任意级别更新为 json 中指定键的指定索引。
你可以像这样使用它
string json = File.ReadAllText(@"Path to your json file");
JToken jToken = JToken.Parse(json);
jToken = FindAndReplace(jToken, "firstName", "Matthew", null);
jToken = FindAndReplace(jToken, "lastName", "Gilbert", null);
jToken = FindAndReplace(jToken, "streetAddress", "Falcon Ave, 91 Street, New Jersey", null);
jToken = FindAndReplace(jToken, "postalCode", "R12H34", null);
jToken = FindAndReplace(jToken, "type", "work", 0);
jToken = FindAndReplace(jToken, "number", "787-878-7878", 0);
jToken = FindAndReplace(jToken, "type", "factory", 1);
jToken = FindAndReplace(jToken, "number", "989-898-9898", 1);
string outputJson = jToken.ToString();
Output:
参考:布赖恩·罗杰斯 https://stackoverflow.com/a/19646950/5514820,
senshin https://stackoverflow.com/a/33829388/5514820