2012-04-07 55 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