使用jQuery将HTML文本刮到JSON中,但由于循环引用而无法进行字符串化

时间:2013-12-18 17:19:33

标签: javascript jquery json

这似乎是一个相当普遍的问题,但我无法弄清楚在我的情况下发生了什么。

问题" Stringify (convert to JSON) a JavaScript object with circular reference"解释说JSON.stringify可以接受过滤函数来帮助解决循环引用问题。 我不明白为什么我的参考文献是循环的,因为我正在创建新的简单对象。

我们假设你有一个像这样的HTML结构:

<div class="oauth-permitted-apps">
    <div class="oauth-client">
        <span class="client_type">Web App</span>
        <span class="client_name">Name</span>
        <span class="client_secret">client_guid1</span>
    </div>
    <div class="oauth-client">
        <span class="client_type">Installed App</span>
        <span class="client_name">Name2</span>
        <span class="client_secret">client_guid2</span>
    </div>
    <div class="oauth-client">
        <span class="client_type">Installed App</span>
        <span class="client_name">Name3</span>
        <span class="client_secret">client_guid3</span>
    </div>
    <!-- and so on -->
</div>

使用以下JavaScript:

var result = $('.oauth2-client')
    .filter( function() {
        return $(this).find('.client_type').text().toLowerCase().indexOf('installed') != -1;
    })
    .map(function() {
        return json = {
            id: $(this).find('.client_id').text(),
            name: $(this).find('.client_name').text()
        };
    });
JSON.stringify(result);

我希望看到类似的东西:

[
    {
        id: "client_guid2",
        name: "Name2"
    },
    {
        id: "client_guid3",
        name: "Name3"
    }
]

但是......我有一个循环引用。我不明白为什么只有两个属性的新JavaScript对象会这样做。我猜测jQuery还有什么东西让我不太明白?

(上下文:在Windows应用商店应用中使用OAuth连接到Web服务。他们已经痛苦不堪(用户必须向我们提供JSON文件,打开Web浏览器几次,然后复制) - 在生成它的60秒内加一个令牌)所以我们想让用户稍微自动化一下这个过程。我用WebView完成了一些我不太喜欢的事情很遗憾,我无法使用window.external.notify,因为Windows 8.1要求您将域添加到应用清单,但我们不知道要添加的域!)

1 个答案:

答案 0 :(得分:3)

你所拥有的实际上是一个包含数组的jQuery对象。您将要使用.get()从jquery对象中解包该数组。

JSON.stringify(result.get());

正如评论中所提到的,使用$.map也是一种选择,虽然我发现在这种情况下它比其他方式更加丑陋。

var result = $.map(
    $('.oauth2-client').filter(function () {
        return $(this).find('.client_type').text().toLowerCase().indexOf('installed') != -1;
    }), 
    function (el) {
        return json = {
            id: $(el).find('.client_id').text(),
            name: $(el).find('.client_name').text()
        };
    });
JSON.stringify(result);