将JSON作为命令行参数传递给Node

时间:2015-09-30 22:37:45

标签: node.js

我想将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; } }

这样做的最佳方式是什么?还是有另一种更明智的方法来完成同样的事情?

3 个答案:

答案 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