使用Groovy中的JsonOutput将不必要的引号添加到JSON文件元素

时间:2016-09-17 09:43:42

标签: arrays json groovy quotes pretty-print

我的Groovy脚本正在创建一个如下所示的JSON文件:

JSON output

hsps数组中有可变数量的元素。基本上,我的输出是正确的,但脚本会为元素添加不必要的引号。相关代码如下所示:

    foundPlasmids.each {
    def tempHSPs = []
    it.hsps.each{
        def hsps = JsonOutput.toJson(
            [bit_score: it.bit_score, 
            evalue: it.evalue, 
            score: it.score, 
            query_from: it.query_from,
            query_to: it.query_to,
            hit_from: it.hit_from,
            hit_to: it.hit_to,
            align_len: it.align_len,
            gaps: it.gaps]
        )
        tempHSPs << JsonOutput.prettyPrint(hsps)
    }

    def output = JsonOutput.toJson(
        [contig: it.contig, title: it.title, accNumber: it.accession, length: it.length, noHSPs: it.noHsps, hsps: tempHSPs]
    )

    prettyOutput << JsonOutput.prettyPrint(output)
}

foundPlasmids是包含所有信息的哈希,包括hsps数组。我prettyPrint将所有hsps数组tempHSPs加入tempHSPs并将output传递给hsps。我无法弄清楚为什么添加了额外的引号,并且无法想出将output数组传递到class Swipe { constructor(element) { this.xDown = null; this.yDown = null; this.element = typeof(element) === 'string' ? document.querySelector(element) : element; this.element.addEventListener('touchstart', function(evt) { this.xDown = evt.touches[0].clientX; this.yDown = evt.touches[0].clientY; }.bind(this), false); } onLeft(callback) { this.onLeft = callback; return this; } onRight(callback) { this.onRight = callback; return this; } onUp(callback) { this.onUp = callback; return this; } onDown(callback) { this.onDown = callback; return this; } handleTouchMove(evt) { if ( ! this.xDown || ! this.yDown ) { return; } var xUp = evt.touches[0].clientX; var yUp = evt.touches[0].clientY; this.xDiff = this.xDown - xUp; this.yDiff = this.yDown - yUp; if ( Math.abs( this.xDiff ) > Math.abs( this.yDiff ) ) { // Most significant. if ( this.xDiff > 0 ) { this.onLeft(); } else { this.onRight(); } } else { if ( this.yDiff > 0 ) { this.onUp(); } else { this.onDown(); } } // Reset values. this.xDown = null; this.yDown = null; } run() { this.element.addEventListener('touchmove', function(evt) { this.handleTouchMove(evt).bind(this); }.bind(this), false); } } 的不同方法。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您放入tempHSPs数组的对象是JSON的字符串表示形式,它们是由prettyPrint函数生成的。 JsonOutput中的所有toJson函数都返回字符串,而prettyPrint接受一个字符串,对其进行格式化并返回一个字符串。

放入tempHSPs的是一个真正的JSON对象或数组。你输入一个字符串,因此最终输出在每个顶级元素中包含一个包含单个字符串值的数组“hsps”。

这有两个问题。

一个是通过调用def output = JsonOutput.toJson没有正确转义字符串,我只能假设它是JsonOutput类中的错误?这似乎不太可能,但我没有更好的解释。它应该看起来更像......

[
    {
        "nohsps": 1,
        "hsps": [
            "{\r\n    \"bit_score\": 841.346,\r\n    \"evalue\": 0,\r\n    (and so on)\r\n}"
        ]
    },
    {
        "nohsps": 6,
        "hsps": [
            "{\r\n    \"bit_score\": 767.48,\r\n    \"evalue\": 0,\r\n    (and so on)\r\n}"
        ]
    }
]

第二个问题是听起来你不想要字符串而是想要JSON对象,所以只需停止将你的Groovy对象变成字符串......

def tempHSPs = []
it.hsps.each{
    def hsps =
        [bit_score: it.bit_score, 
        evalue: it.evalue, 
        score: it.score, 
        query_from: it.query_from,
        query_to: it.query_to,
        hit_from: it.hit_from,
        hit_to: it.hit_to,
        align_len: it.align_len,
        gaps: it.gaps]
    )
    tempHSPs << hsps
}

,如果你想简化它,删除所有关于tempHSP的东西,让JsonObject自动序列化它们,看看它自动出现了什么:

def output = JsonOutput.toJson(
        [contig: it.contig, title: it.title, accNumber: it.accession, length: it.length, noHSPs: it.noHsps, hsps: foundPlasmids*.hsps ]
    )

(我还没有验证这种语法;我只是在处理内存。)

如果它在hsps对象上窒息或者您不喜欢结果输出(例如,如果要删除或重命名某些属性),请继续像现在一样制作地图。