我试图使用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)
尝试将 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)
我删除了对空值等的嘈杂检查,以便更清晰。
这应该有效:
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)
如果有人对此问题有更好的解决方法,请告诉我。