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

Sni*_*ack 7 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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在Commandline中它看起来像这样:

{"config":{"script":{"script_name":"test","dir":"D:\\test","destination":"M:\\neu\\test","params":"/b /s /r:3 /w:5"}}}
Run Code Online (Sandbox Code Playgroud)

但是,如果我只是传递字符串,那么它会被分成几块.但我希望我的程序将其视为一个字符串.

我是否必须调整我的JSON-String?

Sim*_*son 10

将它声明为一个字符串,"""使用\它来逃避另一个,它应该可以工作.

命令行:

"{\"config\":{\"script\":{\"script_name\":\"test\",\"dir\":\"D:\\test\",\"destination\":\"M:\\neu\\test\",\"params\":\"/b /s /r:3 /w:5\"}}}"
Run Code Online (Sandbox Code Playgroud)

  • `'{\"config\":{\"script\":{\"script_name\":\"test\",\"dir\":\"D:\\test\",\"destination\" :\"M:\\neu\\test\",\"params\":\"/b /s /r:3 /w:5\"}}}'` 单引号可能有效 (2认同)

Dan*_*lea 5

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

@Wildcard27:这是一个实际用例,用于创建用于教师学位应用程序的 Windows 任务。JSON 只是我正在使用的 DTO 的简单序列化。

当您序列化 JSON 时,只需将其保存到一个空白文件中,并为其指定一个适当的名称,以便它是唯一的。

    private string CreateTaskConfigurationFile(string taskName, EquipmentEventExtended eventData, string host)
        {
            List<Change> changes = new List<Change>
            {
                new Change(MailConstants.EventName,eventData.EventName),
                new Change(MailConstants.Deadline, eventData.DateTo.Value.ToShortDateString()),
                new Change(MailConstants.EventDetails, eventData.EventDetails),
                new Change(MailConstants.Link,$"{host}/Inventory/Details/{eventData.InventoryId}")
            };

            MailTaskModel mtm = new MailTaskModel
            {
                Body = MailConstants.UpdateTemplate(MailConstants.TaskMailTemplate, changes),
                Subject = "[Reminder] Upcoming Event needs your attention",
                ToAddress = "abcdef@gmail.com",
                IsHtml = true
            };
            var fileName = string.Format(@"E:\{0}.json", taskName);
            using (StreamWriter file = File.CreateText(fileName))
            {
                JsonSerializer js = new JsonSerializer();
                js.Serialize(file, mtm);
            }
            return fileName;
        }
Run Code Online (Sandbox Code Playgroud)

然后,您将文件路径作为参数提供给控制台应用程序:

static void Main(string[] args)
        {
            var configFilePath = args[0];
            var mailConfig = LoadConfigurationFile(configFilePath);
            MailManager manager = new MailManager(mailConfig.ToAddress, mailConfig.FromAddress,mailConfig.Subject, mailConfig.Body,mailConfig.IsHtml);
            manager.SendMail();
        }
        private static MailTaskModel LoadConfigurationFile(string configurationFilePath)
        {
            MailTaskModel mailConfig;
            using(var sr = new StreamReader(configurationFilePath))
            {
                string json = sr.ReadToEnd();
                mailConfig = JsonConvert.DeserializeObject<MailTaskModel>(json);
            }
            return mailConfig;
        }
Run Code Online (Sandbox Code Playgroud)

然后你可以使用类似的东西

ConsoleApplication.exe -yourFilePath
Run Code Online (Sandbox Code Playgroud)

我删除了对空值等的嘈杂检查,以便更清晰。


Xav*_*eña 5

这应该有效:

var jsonString = Environment.CommandLine;
Run Code Online (Sandbox Code Playgroud)

我用调试器测试了它,如下所示:

        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);
Run Code Online (Sandbox Code Playgroud)

使用 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; }
    }
Run Code Online (Sandbox Code Playgroud)

关于 (*) => 反序列化的问题是在命令行前面添加了 exe 信息Environment.CommandLine,它像这样“污染”了 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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有人对此问题有更好的解决方法,请告诉我。