2016-12-02 3 views
-1

Ich habe zwei Programme. Das erste Programm erstellt JSON mithilfe von Json.Net und startet dann das zweite Programm und übergibt das JSON an es. Das zweite Programm speichert das JSON in einer Datei, die das SaveFileDialog von WinForms verwendet. Das Problem ist, dass die Zeichenfolgenwerte in JSON nicht ordnungsgemäß gespeichert werden.JSON Zeichenfolge Werte werden ohne Anführungszeichen gespeichert

Zum Beispiel spart

{ 
    projectName : MY_PROJECT_NAME 
} 

Wenn es

{ 
    "projectName" : "MY_PROJECT_NAME" 
} 

später sein sollte, wenn ich versuche, die JSON deserialisiert und in ein Objekt zu konvertieren, ich erhalte eine Fehlermeldung, aber nur mit String-Werten. Hier

ist der Code, der die Datei speichert:

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

Hier ist der Code, der die JSON erstellt:

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

Was mache ich falsch?

+1

Der Code, den Sie gezeigt haben, ist keine Serialisierung durchführt. Ich bezweifle sehr, dass dies ein JSON.NET-Problem ist. Bitte geben Sie eine [MCVE] an. –

Antwort

0

Das Problem besteht darin, dass Sie JSON in der Befehlszeile von einem Programm zum anderen übergeben. Anführungszeichen und Leerzeichen haben für den Befehlszeilenparser eine besondere Bedeutung. Daher müssen Sie Ihren JSON-String mit Bedacht entfernen, wenn Sie möchten, dass der Befehlszeilenanalyseprozess intakt bleibt. Ein weiteres mögliches Problem ist, dass die Befehlszeile eine Längenbeschränkung hat, abhängig davon, auf welcher Plattform Sie ausgeführt werden. Wenn der zu übergebende JSON also groß ist, wird er möglicherweise abgeschnitten, selbst wenn Sie es richtig umgehen können. Kurz gesagt, ich empfehle diesen Ansatz nicht.

Stattdessen würde ich Ihr erstes Programm den JSON in eine temporäre Datei schreiben, dann den Pfad der temporären Datei an das zweite Programm über die Befehlszeile übergeben. Dieses Programm kann dann die Datei an den vom Benutzer angegebenen Speicherort kopieren.

So etwas wie folgt aus:

Sending Program

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

Programm empfangen

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

Oh vielen Dank. Ich weiß nicht, wie viele Daten ich in der Befehlszeile senden werde. Ihnen ist ein viel besserer Ansatz. – MisaelGaray

+0

Kein Problem; froh, dass ich helfen konnte. –

Verwandte Themen