【问题标题】:Deserialization value in Console application [duplicate]控制台应用程序中的反序列化值 [重复]
【发布时间】:2018-01-30 07:48:18
【问题描述】:

我在 args 参数中将 JSON 值从 windows 应用程序传递到控制台应用程序,并尝试在类对象中对其进行反序列化,但在执行以下操作时出现错误,

解析值时遇到意外字符:L. Path 'Line1', 第 1 行,第 8 位。

我正在使用 JSON.NET 库来执行此操作。下面是我的代码,

Windows 应用程序,

Address address = new Address() { Line1 = "Line 1", Line2 = "Line 2" };
string json = JsonConvert.SerializeObject(address);
Process compiler = new Process();
compiler.StartInfo.FileName = @"D:\Learning\Console\ValidateAddress\ValidateAddress\bin\Debug\ValidateAddress.exe";
compiler.StartInfo.Arguments = json;
compiler.StartInfo.UseShellExecute = false;
compiler.StartInfo.RedirectStandardOutput = true;
compiler.Start();
compiler.WaitForExit();
button1.Text = compiler.StandardOutput.ReadToEnd();

控制台应用程序,

Address m = JsonConvert.DeserializeObject<Address>(args[0]);
System.IO.File.WriteAllText(@"D:\path.txt", args[0]);
Console.WriteLine(args[0]);

在控制台应用程序中,args[0] 参数在文本文件中打印低于值,

{Line1:Line 1,Line2:Line 2}

在字符串值中,它没有得到双引号。 (第 1 行,而不是“第 1 行”)

在 Windows 应用程序中,我得到以下字符串,

"{Line1:Line 1,Line2:Line 2}\r\n"

在反序列化期间我需要在哪里更改控制台应用程序以使其正常工作?

【问题讨论】:

  • 你不应该自己提供双引号吗?
  • 您的意思是,来自 Windows 应用程序?你能分享一下 JSON 字符串的例子吗?

标签: c# asp.net c#-4.0 serialization json.net


【解决方案1】:

原因是传递给程序的参数遵循自己的规则。

特别是,引号表示不应进一步拆分的参数,直到下一个引号结束字符串。因此,您看到引号被删除的事实既合乎逻辑又符合预期。

您可以引用引号,但我不知道确切的语法,也许会有更好的答案告诉您如何在将字符串作为参数传递之前对其进行转义。

一个简单的实验表明你需要通过添加另一个双引号来对双引号进行转义,然后将整个json封装在一组双引号中。

例如,这个:

test.exe { "a": "b" }

作为 4 个参数接收:

  1. {
  2. a:
  3. b
  4. }

而这个:

test.exe "{ ""a"": ""b"" } "

收到时

  1. { "a": "b" }

我不会通过参数将 json 发送给其他程序,我会将其作为标准输入通过管道输入,或者通过文件提供。

【讨论】:

  • 转义 " 的语法是 program.exe \"arg0\" 将以字符串 "arg0" 结尾
猜你喜欢
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 2016-03-30
相关资源
最近更新 更多