Change values in JSON file (writing files)

后端 未结 4 2204
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-27 15:55

I have a settings.json file present in the Release folder of my application. What I want to do is change the value of it, not temporarily, permanently.. That means, deleting

相关标签:
4条回答
  • 2020-11-27 16:34

    Here's a simple & cheap way to do it (assuming .NET 4.0 and up):

    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);
    

    The use of dynamic lets you index right into json objects and arrays very simply. However, you do lose out on compile-time checking. For quick-and-dirty it's really nice but for production code you'd probably want the fully fleshed-out classes as per @gitesh.tyagi's solution.

    0 讨论(0)
  • 2020-11-27 16:35

    I have been able to use the info above to get 2/3rds of my program working. I am updating three values.

    .json format snippet:

    { "Version": "1.0.0", "SignBatches": [ { "SourceRootDirectory": "c:\red", "DestinationRootDirectory": "d:\green", "SignRequestFiles": [ { "SourceLocation": "billboard-GS_PariahHeart-v1.lzp" } ],

    Code that works:

    jsonObj["SignBatches"][0]["SourceRootDirectory"] = Path.GetDirectoryName(args[0]);

    jsonObj["SignBatches"][0]["DestinationRootDirectory"] = Path.GetDirectoryName(args[1]);

    Code that fails:

    jsonObj["SignRequestFiles"][0]["SourceLocation"] = Path.GetFileName(args[0]);

    Note that this is trying to update a value of a nested object in the .json file. the previous two lines are updating a similar value, but they are at the top level.

    The error generated is:

    Unhandled exception. Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot perform runtime binding on a null reference

    0 讨论(0)
  • 2020-11-27 16:42

    Use the JObject class in Newtonsoft.Json.Linq to modify JSON values without knowing the JSON structure ahead of time:

    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);
    

    Example:

    // 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
    //    }
    //  ]
    //}
    
    0 讨论(0)
  • 2020-11-27 16:46

    You must have classes to instantiate json values to :

    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<string> 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<Bot> Bots { get; set; }
        }
    

    Answer to your Ques(Untested code) :

    //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);
    }
    
    0 讨论(0)
提交回复
热议问题