2016-12-02 8 views
-1

私は2つのプログラムを持っています。最初のプログラムはJson.Netを使用してJSONを作成し、JSONを渡して2番目のプログラムを起動します。 2番目のプログラムは、WinFormsのSaveFileDialogを使用してJSONをファイルに保存します。問題は、JSONの文字列値が適切に保存されていないことです。例えばJSON文字列値が引用符なしで保存されています

私はJSONをデシリアライズし、オブジェクトに変換しようとしているとき、それは

{ 
    "projectName" : "MY_PROJECT_NAME" 
} 

その後、私はエラーを取得していますしなければならないとき、それは

{ 
    projectName : MY_PROJECT_NAME 
} 

を保存し、文字列値のみを使用します。ここで

は、ファイルを保存したコードです:

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

は私が間違って何をやっている:

[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を作成するコードはありますか?

+1

あなたが任意のシリアル化を行っていない示したコードを受け取るプログラム

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

送信します。これがJSON.NETの問題であることは非常に疑問です。 [mcve]を入力してください。 –

答えて

0

問題は、あるプログラムから別のプログラムにコマンドラインでJSONを渡すことです。クォート文字とスペースはコマンドラインパーサーにとって特別な意味を持つため、コマンドライン解析プロセスをそのまま引き継ぐには、JSON文字列を慎重にエスケープする必要があります。もう1つの潜在的な問題は、実行しているプラ​​ットフォームに応じて、コマンドラインに長さ制限があることです。したがって、渡すしようとしているJSONが大きい場合、正しくエスケープすることができても、切り捨てられます。要するに、私はこのアプローチをお勧めしません。

代わりに、最初のプログラムでJSONをテンポラリファイルに書き込んだ後、コマンドラインから2番目のプログラムに一時ファイルのパスを渡します。そのプログラムは、ユーザーが指定した正しい場所にファイルをコピーできます。

ので、このような何か:

プログラム

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); 
} 
+0

ありがとうございます。コマンドラインで送信するデータの数はわかりません。あなたの方がはるかに優れたアプローチです。 – MisaelGaray

+0

問題ありません。お役に立てて嬉しいです。 –

関連する問題