JSON响应的正则表达式问题

时间:2013-12-15 23:15:27

标签: regex json

我正在尝试使用正则表达式向JSON响应中的任何数字添加引号。下面是JSON的一个片段。任何帮助表示赞赏。

    "videoIds":[2929365783001,2890489654001,2872798368001,...]

    I need:
    "videoIds":["2929365783001","2890489654001","2872798368001",...]

3 个答案:

答案 0 :(得分:0)

使用正则表达式无法可靠地执行此操作。只需将响应解析为JSON,修改结果数据结构并根据需要将其重新序列化为JSON。以下是我在Python中的表现:

data = json.loads(response)
data["videoIds"] = [str(i) for i in data["videoIds"]]
modified_response = json.dumps(data)

答案 1 :(得分:0)

假设您的JSON字符串被称为str,您可以尝试以下几种方法:

  1. 将JSON转换为JavaScript对象,然后将“videoIds”数组的内容转换为字符串,如:

    var obj=JSON.parse(str),
        rv=[];
    obj.videoIds.forEach(function(elt){
        rv.push(elt.toString());
    });
    obj.videoIds=rv;
    str=JSON.stringify(obj);
    
  2. 提取str的videoIds部分,正则表达式添加双引号的数字,并替换它:

    var matches=str.match(/"videoIds":\[([^\]]+)\]/),
        targ=matches[0].replace(/[\[\]]/g,function(m){ return '\\'+m; }), // escape regex magic chars '[' and ']'
        nums=matches[2].split(/,/),
        rv='"videoIds":["'+nums.join('","')+'"]';
    
    str=str.replace(new Regex(targ),rv); // replace the extracted line
    
  3. 但一般来说,在将原始对象转换为JSON之前修改原始对象可能更容易,因此所有数字实际上都是字符串。

答案 2 :(得分:0)

这是ruby中的正则表达方式。我假设除了缺少的引号,JSON很好。此代码将为所有键添加引号,并在没有引号的情况下添加空值。请注意,这会在数字,truefalsenull等值中添加双引号。

jsonstr = <<'LOD'
{
    menu: {
        id: "file",
        "value": File,
        "popup": {
            "videoIds":[2929365783001,2890489654001,2872798368001,...],
            toto:titi,
            "\"glip":["glop\\",glup]
        }
    }
}
LOD
jsonstr = jsonstr.gsub(
    /(?x)
     (  # group 1: possible content before a value or key without double quotes
        (?>
           (?> "(?>[^"\\]++|\\{2}|\\.)*+" )? # content inside double quotes
           [\]\[}{:,\s]++                    # spaces and special characters 
        )++
     )
     ( [^\]\[{},:"]+? ) # group 2: value or key without double quotes
     (?= \s* (?: [\]:,}] | \z ) )
    /,
     '\1"\2"')
puts jsonstr

组1用于跳过双引号之间的所有键或值。