我有两个程序。第一个程序使用JSON.NET创建一些JSON,然后启动第二个程序,将JSON传递给它。第二个程序使用Winforms中的SaveFileDialog
将JSON保存到文件。问题是JSON中的字符串值无法正确保存。
例如,它保存
{
projectName : MY_PROJECT_NAME
}
应该是
{
"projectName" : "MY_PROJECT_NAME"
}
稍后,当我试图对json进行估算并转换为对象时,我会遇到错误,但仅带有字符串值。
这是保存文件的代码:
[STAThread]
static void Main(string[] args)
{
string seriaizedData = args[0];
Stream streamData;
SaveFileDialog savefiledialog = new SaveFileDialog();
savefiledialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/Bamboo Wall";
savefiledialog.Filter = "bamboo files (*.bamboo)|*.bamboo|All files (*.*)|*.*";
savefiledialog.FilterIndex = 1;
savefiledialog.RestoreDirectory = true;
if (savefiledialog.ShowDialog() == DialogResult.OK)
{
if ((streamData = savefiledialog.OpenFile()) != null)
{
byte[] buffer = Encoding.ASCII.GetBytes(seriaizedData);
streamData.Write(buffer, 0, buffer.Length);
streamData.Close();
}
}
}
这是创建JSON的代码:
FloorModel grdData = GridData.gridData.gridDataClassList[GetActiveTabIndex()];
//How I get the object does not matter so much
string jsonObj = JsonConvert.SerializeObject(grdData);
print (jsonObj);
Process myProcess = new Process();
myProcess.StartInfo.FileName = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "Narnia.exe";
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.StartInfo.Arguments = jsonObj;
myProcess.Start();
我在做什么错?
问题是您在命令行上将JSON从一个程序传递到另一个程序。引用字符和空格对命令行解析器具有特殊的意义,因此,如果您希望它能够在命令行解析过程完整地生存,则需要明智地逃脱JSON字符串。另一个潜在的问题是,命令行具有长度限制,具体取决于您正在运行的平台。因此,如果您要通过的JSON很大,即使您设法正确逃脱了,它也可能会被截断。简而言之,我不建议这种方法。
相反,我将使您的第一个程序将JSON写入临时文件,然后通过命令行将临时文件的路径传递到第二个程序。然后,该程序可以将文件复制到用户指定的正确位置。
所以,类似的东西:
发送程序
FloorModel grdData = GridData.gridData.gridDataClassList[GetActiveTabIndex()];
string json = JsonConvert.SerializeObject(grdData);
string tempFile = Path.GetTempFileName();
File.WriteAllText(tempFile, json);
Process myProcess = new Process();
myProcess.StartInfo.FileName = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "Narnia.exe";
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
myProcess.StartInfo.Arguments = '"' + tempFile + '"';
myProcess.Start();
接收程序
string jsonTempFile = args[0];
try
{
SaveFileDialog savefiledialog = new SaveFileDialog();
savefiledialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "/Bamboo Wall";
savefiledialog.Filter = "bamboo files (*.bamboo)|*.bamboo|All files (*.*)|*.*";
savefiledialog.FilterIndex = 1;
savefiledialog.RestoreDirectory = true;
if (savefiledialog.ShowDialog() == DialogResult.OK)
{
File.Copy(jsonTempFile, savefiledialog.FileName, overwrite: true);
}
}
finally
{
File.Delete(jsonTempFile);
}