Ниже 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();
Выход:
![enter image description here](https://i.stack.imgur.com/TP9Nf.png)
Ссылка:
Брайан Роджерс ,
senshin