如何从json编码对象重构命令

时间:2014-02-20 21:51:24

标签: python json parameters

我希望能够通过json编码和解码方法,参数对。像这样:

fn = 'simple_function'
arg = 'blob'

encoded = json.dumps([fn, arg])
decoded = json.loads(encoded)

method, args = decoded
fn = getattr(self, method)
fn(*args)

但它失败了,因为python将'blob'字符串拆分为每个字符的元组(奇怪的行为)。我猜它是有效的,如果args是一个实际的项目列表。如果我们不想发送任何args,调用没有参数的函数(没有足够的值来解压错误),它也会失败。)

如何为此构建一个非常通用的机制?我正在尝试制作一个可以通过这种方式在客户端上调用函数的服务器,主要是因为我不知道如何做到这一点。

所以,寻找一个解决方案,让我可以调用没有,一个或任意数量的参数的函数。

理想的解决方案可能如下所示:

def create_call(*args):
    cmd = json.dumps(args)

def load_call(cmd):
    method, optional_args = json.loads(*cmd)
    fn = getattr(object, method)
    fn(*optional_args)

并且不使用args,单个字符串arg,它不会被*分成列表,或者是任何类型的args列表。

1 个答案:

答案 0 :(得分:0)

你的args是一个单独的对象。不是清单。所以你需要

fn = 'simple_function'
arg = 'blob'

encoded = json.dumps([fn, arg])
decoded = json.loads(encoded)

method, args = decoded
fn = getattr(self, method)
fn(args) #don't try to expand the args

OR

fn = 'simple_function'
arg = 'blob'

encoded = json.dumps([fn, [arg]]) #make sure to make a list of the arguments
decoded = json.loads(encoded)

method, args = decoded
fn = getattr(self, method)
fn(*args) 

OR

fn = 'simple_function'
arg = 'blob'

encoded = json.dumps([fn, arg])
decoded = json.loads(encoded)

method, args = decoded[0], decoded[1:] #cut them up into a single function name and list of args
fn = getattr(self, method)
fn(*args)

哪个“或”真的取决于你想要的东西。