将JSON字符串作为命令行参数传递

时间:2016-03-24 15:05:10

标签: c# json

我正在尝试使用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?

6 个答案:

答案 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键/值对的值部分也可以是:

  1. 另一个JSON对象
  2. 列表

"key": {}, ....
"key":[], ....

答案 5 :(得分:-1)

尝试将JSON对象保存到文件中,并将该文件作为参数传递给应用程序。