通过命令行传递JSON字符串

Kap*_*pil 3 c# json cmd

我将一个对象序列化为json字符串并通过命令行将其传递给应用程序但是当我在应用程序中收到参数时,这不再是json字符串而是常规字符串.

我正在使用下面的代码来创建json字符串

var jsonStr = new JavaScriptSerializer().Serialize(obj);
Run Code Online (Sandbox Code Playgroud)

我正在传递的字符串 - "{"name":"abc","place":"xyz"}"
我收到的字符串 - "{name:abc,place:xyz}";

如何维护json字符串的结构?

Mat*_*zer 13

我想双重推论已被消除,因为它们在CLI世界中具有意义.

我会说将整个JSON转换为基本64字符串,然后,在CLI内部再次转换为常规字符串应该工作:

var jsonStr = Convert.ToBase64String(Encoding.UTF8.GetBytes(new JavaScriptSerializer().Serialize(obj)));

// When your receive the whole string....
var jsonStr = Encoding.UTF8.GetString(Convert.FromBase64String(inputStr));

// Now deserialize your JSON string into a regular .NET object...
Run Code Online (Sandbox Code Playgroud)

回答@Panagiotis Kanavos的一些评论......

CLI不会破坏任何字符串 - 人们现在会注意到.如果OP发送不同的字符串,则问题出在该代码中,而不是CLI

正如我在评论中指出的那样,我知道在.NET世界中我们不需要逃避JSON,也许在其他环境中也没有必要这样做.

我建议使用base 64方法,因为它是一个防弹解决方案,并且因为OP提供了一些细节和代码示例不足,所以在一天结束时,我相信它的基础64方法与仅仅避免双引号一样有效,但它也是提供了一个附加值:它除了可以逃避任何特殊字符".

顺便说一句,实际情况是CLI会阻止某些字符.redis-cli在Windows上不允许使用大括号...

更新2

由于@Panagiotis Kanavos将CLI与公共语言接口混淆,我想确保每个阅读我答案的人都将CLI理解为命令行界面.


Yoh*_*all 6

只需使用反斜杠转义引号,这样CMD就不会删除JSON中的引号.

应该传递的字符串:

"{\"name\":\"abc\",\"place\":\"xyz\"}"
Run Code Online (Sandbox Code Playgroud)

将收到的字符串:

{"name":"abc","place":"xyz"}
Run Code Online (Sandbox Code Playgroud)

使用此代码来转义字符串:

string jsonString = new JavaScriptSerializer().Serialize(obj);
string escapedString = jsonString.Replace("\"", "\\\"");
Run Code Online (Sandbox Code Playgroud)