2012-04-07 81 views
0

我想要做的是更改Google Chrome瀏覽器的Preferences文件中的兩個值。我現在使用的代碼是低於如何修改JSON格式文件?

[DataContract] 
public class Mdata 
{ 
    [DataMember(Name = "homepage")] 
    public String homepage { get; private set; } 
    [DataMember(Name = "homepage_is_newtabpage")] 
    public Boolean isNewTab { get; private set; } 
    [DataMember(Name = "keep_everything_synced")] 
    public Boolean isSynced { get; private set; } 
    public Mdata() { } 
    public Mdata(String data) 
    { 
     homepage = data; 
    } 
} 

public static Mdata FindData(String json) 
{ 
    Mdata deserializedData = new Mdata(); 
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)); 
    DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedData.GetType()); 
    deserializedData = ser.ReadObject(ms) as Mdata; 
    ms.Close(); 
    return deserializedData; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    const int LikeWin7 = 6; 
    OperatingSystem osInfo = Environment.OSVersion; 
    DirectoryInfo strDirectory; 
    String path = null, file = null, data; 

    if (osInfo.Platform.Equals(System.PlatformID.Win32NT)) 
     if (osInfo.Version.Major == LikeWin7) 
      path = Environment.GetEnvironmentVariable("LocalAppData") + 
       @"\Google\Chrome\User Data\Default"; 
    if (path == null || path.Length == 0) 
     throw new ArgumentNullException("Fail. Bad OS."); 
    if (!(strDirectory = new DirectoryInfo(path)).Exists) 
     throw new DirectoryNotFoundException("Fail. The directory was not fund"); 
    if (!new FileInfo(file = Directory.GetFiles(strDirectory.FullName, "Preferences*")[0]).Exists) 
     throw new FileNotFoundException("Fail. The file was not found.", file); 

    Mdata info = FindData(data = System.IO.File.ReadAllText(file)); 
    Console.WriteLine(info.homepage); // show me http://www.google.com 
    Console.WriteLine(info.isNewTab); // prints false 
    MessageBox.Show(info.isSynced); // prints true 
    } 

什麼,我想現在要做的就是info.homepage,info.isNewTab和info.isSynced的值更改爲其他值,要像(在首選項文件):

"homepage": "http://www.myWebsite.com/", 
"homepage_is_newtabpage": true, 
... 
"keep_everything_synced": false, 

我試圖directrly設置新值是這樣的:

info.homepage = "www.mysite.com"; 
info.isNewTab = true; 
info.isSynced = false; 

,但沒有機會!

如何爲上述三個對象分配新值?

+2

你是如何將數據寫回磁盤的? – svick 2012-04-07 09:30:38

回答

2

您發佈的代碼有兩個問題:

  1. 你永遠不將數據寫回磁盤。
  2. 你只映射了你感興趣的三個屬性。這意味着只有那些會被反序列化。而當您更改它們並將其寫回到磁盤時,只有這些屬性將被序列化,因爲所有其他數據都沒有進入到您的數據結構中。

有你的問題的幾種可能的解決方案:

  1. 完全映射出你的Mdata結構中的首選項文件。這顯然有點痛苦,因爲偏好文件非常大。
  2. this question的接受答案顯示瞭如何將任意JSON對象取消/序列化爲字典。
  3. 根本不要使用JSON反序列化。只要打開文件,逐行閱讀並使用正則表達式來匹配你想要的設置。找到一個值時替換該值。並寫回每一行(修改或未修改)。
1

一旦你的反序列化對象,因爲你做了這裏:

Mdata info = FindData(data = System.IO.File.ReadAllText(file)); 

指定您希望給這些屬性:

info.homepage = "www.mysite.com"; 
info.isNewTab = true; 
info.isSynced = false; 

然後序列化對象迴文件,覆蓋它。 這是缺失的位 - 你永遠不會將變化寫入磁盤。

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Mdata)); 
using(var fs = new FileStream(filePath, FileMode.Create) 
{ 
    ser.WriteObject(fs, info); 
} 
+0

這將刪除所有舊數據,並只將這三個數據成員添加到文件中,有沒有辦法在不刪除所有其他成員的情況下修改它們的值? – 2012-04-07 10:16:37

+0

@ShikataGaNai - 你是什麼意思?其他數據成員將在您反序列化時保留其值。你甚至嘗試過嗎? – Oded 2012-04-07 15:07:37