2014-02-11 4 views
6

내 응용 프로그램의 릴리스 폴더에 settings.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" 
    } 
] 
} 

은 가정하자 내가 암호 값을 변경할 JSON 파일의 형식 대신 BOT 암호 나는 단지 비밀번호가되고 싶어요. 어떻게해야합니까?

답변

15

여기 그것을 할 수있는 간단한 & 싼 방법 (.NET 가정 : 당신의 QUES (테스트되지 않은 코드)에

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

답변 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 객체와 배열에 ndex를 넣는 것은 매우 간단합니다. 그러나 컴파일 타임 검사에서 손실됩니다. 신속하고 지저분한 경우에는 정말 멋지지만 프로덕션 코드의 경우 @ gitesh.tyagi의 솔루션에 따라 완벽하게 정리 된 클래스를 원할 것입니다.

+0

들여 쓰기가 엉망이 되어도 작동했습니다. 모든 것이 1 줄로되어 있습니다. – Bone

+0

예,'JsonConvert.SerializeObject'는 두 번째 매개 변수'Formatting.Indented'를 취할 수 있습니다. 수정 된 답변 – agentnega

+0

감사합니다. <3 – Bone

4

당신은에 JSON 값을 인스턴스화하는 클래스가 있어야합니다

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