2016-09-28 122 views
1

我有一个“深”的JSON字符串,我需要在URL中作为GET变量传递。它看起来像如下:用Python解析decodeURIComponent JSON字符串

{ 
    "meta": { 
    "prune": true, 
    "returnFields": ["gf", "gh", "gh", "rt"], 
    "orient": "split" 
    }, 
    "indicators": [{ 
    "type": "beta", 
    "computeOn": "gf", 
    "parameters": { 
     "timeperiod": 5, 
     "nbdevup": 2, 
     "nbdevdn": 2, 
     "matype": 0 
    } 
    }, { 
    "type": "alpha", 
    "computeOn": "gf", 
    "parameters": { 
     "timeperiod": 30 
    } 
    }] 
}; 

当使用jQuery.param编码,结果如下:

var recursiveEncoded = jQuery.param(body); 
console.log(recursiveEncoded); 
meta%5Bprune%5D=true&meta%5BreturnFields%5D%5B%5D=gf&meta%5BreturnFields%5D%5B%5D=gh&meta%5BreturnFields%5D%5B%5D=gh&meta%5BreturnFields%5D%5B%5D=rt&meta%5Borient%5D=split&indicators%5B0%5D%5Btype%5D=beta&indicators%5B0%5D%5BcomputeOn%5D=gf&indicators%5B0%5D%5Bparameters%5D%5Btimeperiod%5D=5&indicators%5B0%5D%5Bparameters%5D%5Bnbdevup%5D=2&indicators%5B0%5D%5Bparameters%5D%5Bnbdevdn%5D=2&indicators%5B0%5D%5Bparameters%5D%5Bmatype%5D=0&indicators%5B1%5D%5Btype%5D=alpha&indicators%5B1%5D%5BcomputeOn%5D=gf&indicators%5B1%5D%5Bparameters%5D%5Btimeperiod%5D=30 

被解码为以下内容:如果只使用一个串行

var recursiveDecoded = decodeURIComponent(jQuery.param(body)); 
console.log(recursiveDecoded); 

meta[prune]=true&meta[returnFields][]=gf&meta[returnFields][]=gh&meta[returnFields][]=gh&meta[returnFields][]=rt&meta[orient]=split&indicators[0][type]=beta&indicators[0][computeOn]=gf&indicators[0][parameters][timeperiod]=5&indicators[0][parameters][nbdevup]=2&indicators[0][parameters][nbdevdn]=2&indicators[0][parameters][matype]=0&indicators[1][type]=alpha&indicators[1][computeOn]=gf&indicators[1][parameters][timeperiod]=30 

服务器上的字符串结果将字符串作为键值对中的键:

"query": { 
    "{\"meta\":{\"prune\":true,\"returnFields\":[\"gf\",\"gh\",\"gh\",\"rt\"],\"orient\":\"split\"},\"indicators\":[{\"type\":\"beta\",\"computeOn\":\"gf\",\"parameters\":{\"timeperiod\":5,\"nbdevup\":2,\"nbdevdn\":2,\"matype\":0}},{\"type\":\"alpha\",\"computeOn\":\"gf\",\"parameters\":{\"timeperiod\":30}}]}": "" 
    }, 

我的后端处理是用Python完成的。有什么模块可以将上述结果转换为类似原始对象的dict

+2

你可能会更好发送它作为JSON,然后将其反序列化到Python中的对象。这种方式不那么凌乱。 – haliphax

+0

要求是发送GET请求。我已经完成了可以处理JSON字符串的POST请求。 –

+0

您可以使用GET方法在不使用'$ .param()'的情况下在jQuery中发送Object。如果你确定你的数据也以服务器上的JSON结尾,那么作为你的AJAX请求的结果,你应该没问题。最糟糕的情况是,你必须将'dataType'设置为''json'。 – PHPglue

回答

1

好吧,既然我们在评论中把它弄糊涂了,我会在这里为后人张贴答案。

在JavaScript端使用JSON.stringify的组合来序列化您的数据结构,并在Python端使用json.loads来反序列化它。将序列化的结构作为查询字符串参数(在您的示例中为“查询”),然后从Python中的查询字符串参数中读取值。好哇!

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

+0

在通过任何AJAX方法发送它之前,不需要'JSON.stringify()'JSON jQuery的。 – PHPglue

+0

确实如果你使用jQuery。我有点困惑,因为OP已经说过关于jQuery的一些不是每个客户端的保证(尽管在示例代码中使用了jQuery)。 – haliphax

+0

OP是否说客户端正在发送一个字符串作为GET数据,而不是GET数据本身?为什么OP会期望服务器接收类似于他服务器上的字符串?要求您的客户端发送POST或GET数据,而不是疯狂的字符串。 – PHPglue