Saltar al contenido

Cambiar valores en el archivo JSON (escribir archivos)

Presta atención porque en esta reseña hallarás el hallazgo que buscas.

Solución:

Aquí hay una forma simple y económica de hacerlo (asumiendo .NET 4.0 y superior):

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

El uso de dynamic le permite indexar directamente en objetos json y matrices de manera muy simple. Sin embargo, pierde la comprobación en tiempo de compilación. Para rápido y sucio, es realmente bueno, pero para el código de producción, probablemente desee las clases completamente desarrolladas según la solución de @ gitesh.tyagi.

Utilizar el JObject clase en Newtonsoft.Json.Linq para modificar los valores JSON sin conocer la estructura JSON antes de tiempo:

using Newtonsoft.Json.Linq;

string jsonString = File.ReadAllText("myfile.json");
// Convert the JSON string to a JObject:
JObject jObject = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString) as JObject;
// Select a nested property using a single string:
JToken jToken = jObject.SelectToken("Bots[0].Password");
// Update the value of the property: 
jToken.Replace("myNewPassword123");
// Convert the JObject back to a string:
string updatedJsonString = jObject.ToString();
File.WriteAllText("myfile.json", updatedJsonString);

Ejemplo:

// This is the JSON string from the question
string jsonString = ""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"]";

JObject jObject = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString) as JObject;

// Update a string value:
JToken jToken = jObject.SelectToken("Bots[0].Password");
jToken.Replace("myNewPassword123"); 

// Update an integer value:
JToken jToken2 = jObject.SelectToken("Bots[0].TradePollingInterval");
jToken2.Replace(555);

// Update a boolean value:
JToken jToken3 = jObject.SelectToken("Bots[0].AutoStart");
jToken3.Replace(false);

// Get an indented/formatted string:
string updatedJsonString = jObject.ToString(); 

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

Debe tener clases para crear instancias de valores json para:

public class Bot
    
        public string Username  get; set; 
        public string Password  get; set; 
        public string DisplayName  get; set; 
        public string Backpack  get; set; 
        public string ChatResponse  get; set; 
        public string logFile  get; set; 
        public string BotControlClass  get; set; 
        public int MaximumTradeTime  get; set; 
        public int MaximumActionGap  get; set; 
        public string DisplayNamePrefix  get; set; 
        public int TradePollingInterval  get; set; 
        public string LogLevel  get; set; 
        public string AutoStart  get; set; 
    
    
 

   public class RootObject
    
        public List Admins  get; set; 
        public string ApiKey  get; set; 
        public string mainLog  get; set; 
        public string UseSeparateProcesses  get; set; 
        public string AutoStartAllBots  get; set; 
        public List Bots  get; set; 
    

Responda a su pregunta (código no probado):

//Read file to string
string json = File.ReadAllText("PATH TO settings.json");

//Deserialize from file to object:
var rootObject = new RootObject();
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);

Si haces scroll puedes encontrar las observaciones de otros administradores, tú además puedes mostrar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *