Modifier les valeurs dans un fichier JSON (écriture de fichiers)

J’ai un fichier settings.json présent dans le dossier Release de mon application. Ce que je veux faire est de changer la valeur de celle-ci, pas temporairement, de façon permanente. Cela signifie, supprimer l’ancienne entrée, en écrire une nouvelle et la sauvegarder.

Voici le format du fichier JSON

{ "Admins":["234567"], "ApiKey":"Text", "mainLog": "syslog.log", "UseSeparateProcesses": "false", "AutoStartAllBots": "true", "Bots": [ { "Username":"BOT USERNAME", "Password":"BOT PASSWORD", "DisplayName":"TestBot", "Backpack":"", "ChatResponse":"Hi there bro", "logFile": "TestBot.log", "BotControlClass": "Text", "MaximumTradeTime":180, "MaximumActionGap":30, "DisplayNamePrefix":"[AutomatedBot] ", "TradePollingInterval":800, "LogLevel":"Success", "AutoStart": "true" } ] } 

Supposons que je veuille changer la valeur du mot de passe et que, au lieu de BOT PASSWORD, je souhaite que ce soit uniquement un mot de passe. Comment je fais ça?

Voici un moyen simple et peu coûteux de le faire (en supposant que .NET 4.0 et supérieur):

 ssortingng json = File.ReadAllText("settings.json"); dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(json); jsonObj["Bots"][0]["Password"] = "new password"; ssortingng output = Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj, Newtonsoft.Json.Formatting.Indented); File.WriteAllText("settings.json", output); 

L’utilisation de dynamic permet d’indexer directement dans des objects et des tableaux JSON. Cependant, vous perdez la vérification au moment de la compilation. C’est vraiment bien pour quick-and–dirty, mais pour le code de production, vous voudrez probablement des classes complètement étoffées, conformément à la solution de @ gitesh.tyagi.

Vous devez avoir des classes pour instancier des valeurs JSON à:

 public class Bot { public ssortingng Username { get; set; } public ssortingng Password { get; set; } public ssortingng DisplayName { get; set; } public ssortingng Backpack { get; set; } public ssortingng ChatResponse { get; set; } public ssortingng logFile { get; set; } public ssortingng BotControlClass { get; set; } public int MaximumTradeTime { get; set; } public int MaximumActionGap { get; set; } public ssortingng DisplayNamePrefix { get; set; } public int TradePollingInterval { get; set; } public ssortingng LogLevel { get; set; } public ssortingng AutoStart { get; set; } } public class RootObject { public List Admins { get; set; } public ssortingng ApiKey { get; set; } public ssortingng mainLog { get; set; } public ssortingng UseSeparateProcesses { get; set; } public ssortingng AutoStartAllBots { get; set; } public List Bots { get; set; } } 

Répondez à vos questions (code non testé):

 //Read file to ssortingng ssortingng json = File.ReadAllText("PATH TO settings.json"); //Deserialize from file to object: JsonConvert.PopulateObject(json, RootObject); //Change Value RootObject.Bots[0].Password = "password"; // serialize JSON directly to a file again using (StreamWriter file = File.CreateText(@"PATH TO settings.json")) { JsonSerializer serializer = new JsonSerializer(); serializer.Serialize(file, RootObject); }