我想将JSON对象作为命令行参数传递给node。像这样:
public class Month {
// instance variables - replace the example below with your own
private int monthNumber;
private String monthName;
private String newMonthName;
/**
* Constructor for objects of class Month
*/
public Month(int input){
if((input == 0) || (input > 12)){
System.out.println("Error: Month number must be between 1 and 12");
}
else if(input < 0){
System.out.println("Error: Month number must be positive");
}
else{ //the value of the input is valid
System.out.println("Month number is VALID");
}
setMonthName(monthName);
printMonth(input);
monthNumber = input;
}
/**
*
*/
private void setMonthName(String monthName)
{
switch(monthNumber){
case 1:
monthName = "January";
break;
case 2:
monthName = "February";
break;
case 3:
monthName = "March";
break;
case 4:
monthName = "April";
break;
case 5:
monthName = "May";
break;
case 6:
monthName = "June";
break;
case 7:
monthName = "July";
break;
case 8:
monthName = "August";
break;
case 9:
monthName = "September";
break;
case 10:
monthName = "October";
break;
case 11:
monthName = "November";
break;
case 12:
monthName = "December";
break;
default:
monthName = "Invalid month";
break;
}
}
/**
*
*/
private void printMonth(int input)
{
switch(input){
case 0:
System.out.println("Month " + input + " is not a month");
break;
case 1:
System.out.println("Month " + input + " is January");
break;
case 2:
System.out.println("Month " + input + " is February");
break;
case 3:
System.out.println("Month " + input + " is March");
break;
case 4:
System.out.println("Month " + input + " is April");
break;
case 5:
System.out.println("Month " + input + " is May");
break;
case 6:
System.out.println("Month " + input + " is June");
break;
case 7:
System.out.println("Month " + input + " is July");
break;
case 8:
System.out.println("Month " + input + " is August");
break;
case 9:
System.out.println("Month " + input + " is September");
break;
case 10:
System.out.println("Month " + input + " is October");
break;
case 11:
System.out.println("Month " + input + " is November");
break;
case 12:
System.out.println("Month " + input + " is December");
break;
default:
System.out.println("Month " + input + "is an invalid month");
break;
}
}
/**
*
*/
public int getMonthNumber()
{
return monthNumber;
}
/**
*
*/
public String getMonthName()
{
return monthName;
}
}
这样做的最佳方式是什么?还是有另一种更明智的方法来完成同样的事情?
答案 0 :(得分:4)
如果是少量数据,我会使用https://www.npmjs.com/package/minimist,这是nodejs的命令行参数解析器。这不是json,但你可以简单地传递像
这样的选项--name=Foo
或
-n Foo
我认为这比json更适合命令行工具。
如果您想要使用大量数据,则最好创建一个json文件,并仅将文件名作为命令行参数传递,以便程序可以加载并解析它。
作为命令行参数的大对象很可能不是一个好主意。
答案 1 :(得分:1)
这对我有用:
$ node foo.js --json-array='["zoom"]'
然后在我的代码中我有:
import * as _ from 'lodash';
const parsed = JSON.parse(cliOpts.json_array || []);
_.flattenDeep([parsed]).forEach(item => console.log(item));
我使用dashdash,我认为这是命令行解析的最佳选择。
要对对象做同样的事情,只需使用:
$ node foo.js --json-object='{"bar": true}'
答案 2 :(得分:1)
这可能有点矫kill过正,不适合您的工作,因为它使JSON变得不可读,但是我发现一种健壮的方法(如“在任何OS上均可工作”)是使用base64编码。
我想在程序的各个部分之间通过JSON传递很多选项(一个主节点例程调用一堆小的从属节点例程)。我的JSON非常大,带有令人讨厌的字符(例如引号和反斜杠),因此清理它(特别是在多OS上下文中)听起来很痛苦。
最后,我的代码(TypeScript)如下:
在调用程序中:
const buffer: Buffer = new Buffer(JSON.stringify(myJson));
const command: string = 'node slave.js --json "' + buffer.toString('base64') + '" --b64';
const slicing: child_process.ChildProcess = child_process.exec(command, ...)
在接收程序中:
let inputJson: string;
if (commander.json) {
inputJson = commander.json;
if (commander.b64) {
inputJson = new Buffer(inputJson, 'base64').toString('ascii');
}
}
(-b64标志使我仍然可以在手动输入普通JSON或使用base64版本之间进行选择,也为了方便起见,我使用commander)