我正在尝试使用Commandline将json字符串传递给C#-Program。
JSON-String看起来像这样:
{
"config": {
"script": {
"script_name": "test",
"dir": "D:\\test",
"destination": "M:\\neu\\test",
"params": "/b /s /r:3 /w:5"
}
}
}
在Commandline中,它看起来像这样:
{"config":{"script":{"script_name":"test","dir":"D:\\test","destination":"M:\\neu\\test","params":"/b /s /r:3 /w:5"}}}
但是,如果我只是传递字符串,那么它会被分成几块。但我希望我的程序只将其视为一个字符串。
我是否必须调整我的JSON-String?
答案 0 :(得分:9)
将其声明为包含""
的字符串,并使用"
转义其他\
,它应该有效。
命令行:
"{\"config\":{\"script\":{\"script_name\":\"test\",\"dir\":\"D:\\test\",\"destination\":\"M:\\neu\\test\",\"params\":\"/b /s /r:3 /w:5\"}}}"
答案 1 :(得分:4)
这应该有效:
var jsonString = Environment.CommandLine;
我用调试器测试了它,如下所示:
var jsonString = Environment.CommandLine;
// (*) This correction makes it work, although it is pretty ugly:
jsonString = jsonString.Split(new string[] { ".exe\" " }, StringSplitOptions.None)[1];
var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(jsonString);
使用VS2015进行调试,而不是修改json输入(甚至不删除行更改)。我使用与您输入相同的结构:
public class Script
{
public string script_name { get; set; }
public string dir { get; set; }
public string destination { get; set; }
public string @params { get; set; }
}
public class Config
{
public Script script { get; set; }
}
public class RootObject
{
public Config config { get; set; }
}
关于(*)=&gt;反序列化的问题是exe信息是在Environment.CommandLine
命令行的前面添加的,并且&#34;污染&#34;像这样的json:jsonString
=
"path\to\assembly\name.vshost.exe" {
"config": {
"script": {
"script_name": "test",
"dir": "D:\\test",
"destination": "M:\\neu\\test",
"params": "/b /s /r:3 /w:5"
}
}
}
如果有人对这个问题有更好的解决方法,请告诉我。
答案 2 :(得分:1)
而不是查看&#34; string [] args&#34;你可以使用Environment.CommandLine
。
来自MSDN https://msdn.microsoft.com/en-us/library/system.environment.commandline.aspx
public static void Main()
{
Console.WriteLine();
// Invoke this sample with an arbitrary set of command line arguments.
Console.WriteLine("CommandLine: {0}", Environment.CommandLine);
}
//示例显示如下输出:
// C:&gt; env0 ARBITRARY TEXT
//
// CommandLine:env0 ARBITRARY TEXT
答案 3 :(得分:1)
只需在捕获值后将json值发送到命令行并替换它。这对我有用。
args[1].Replace("{","{\"").Replace(":","\":\"").Replace(",","\",\"").Replace("}","\"}");
答案 4 :(得分:0)
继@Selcuk Gurals帖子之后,这是一个更完整的答案:
args[1].Replace("{", "{\"").Replace(":", "\":\"").Replace(",", "\",\"").Replace("}", "\"}").Replace(":\"[", ":[").Replace(":\"{", ":{").Replace("https\":\"", "https:").Replace("http\":\"", "http:").Replace("\":\"9", ":9").Replace("}\",", "},").Replace("]\",", "],").Replace("}\"}", "}}");
这可满足嵌入式http / https和端口等需求。我的端口号在9000区域...因此,正则表达式解决方案会更好。但它比以前的答案更好 JSON键/值对的值部分也可以是:
"key": {}, ....
"key":[], ....
答案 5 :(得分:-1)
尝试将JSON对象保存到文件中,并将该文件作为参数传递给应用程序。