2014-02-11 29 views
6

我的應用程序的Release文件夾中有一個settings.json文件。我想要做的是改變它的價值,而不是暫時的,永久的。這意味着,刪除舊的條目,寫一個新的條目並保存它。更改JSON文件中的值(編寫文件)

這裏是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" 
    } 
] 
} 

假設我要更改密碼值的格式和而非BOT密碼我想這是唯一的密碼。我怎麼做?

回答

15

這裏有一個簡單的&廉價的方式做到這一點(假設.NET 4.0及以上):

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

使用dynamic讓你我直接進入json對象和數組非常簡單。但是,您在編譯時檢查中會失去作用。對於快速而骯髒的應用程序來說,它非常好,但對於產品代碼,您可能需要根據@ gitesh.tyagi的解決方案完全充實的類。

+0

它雖然縮進壓縮工作..它都在1行..任何方式來解決這個問題? – Bone

+0

是的,'JsonConvert.SerializeObject'可以取第二個參數,'Formatting.Indented'。編輯答案。 – agentnega

+0

非常感謝<3 – Bone

4

您必須具有類實例化JSON值:

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

回答您的疑問句(未測試的代碼):

//Read file to string 
string 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); 
}