在javascript

时间:2016-12-30 21:19:37

标签: javascript arrays json django

我从django-rest-framework api调用中得到以下项目:

services = "['service1', 'service2', 'service3']"

我想要services = ['service1', 'service2', 'service3']

在我的JavaScript中,我尝试services = JSON.parse(services) - 没有做任何事情,也试过$.parseJSON(services)

在我的序列化程序中,我尝试将设置服务设为ListField,同时尝试JSONSerializerField()

class JSONSerializerField(serializers.Field):
    # Adapted from http://stackoverflow.com/a/28200902
    def to_internal_value(self, data):
        return json.loads(data)

    def to_representation(self, value):
        return value

4 个答案:

答案 0 :(得分:3)

您需要使用双引号而不是单引号。

这应该有效:

services = '["service1", "service2", "service3"]'
JSON.parse(services)`

答案 1 :(得分:1)

为了确保Django和某些javascript浏览器代码之间的正确解析,请确保在控制器中返回JsonResponse()。这可以确保您可以使用Javascript中的JSON.parse()来解析它。

答案 2 :(得分:0)

我最近发现了一种解决类似问题的迂回方法。我想将数组作为数据属性存储在 HTML 元素中,以便稍后在 JS 中使用它。但是,这样的 HTML 属性只能存储为字符串。为了解决这个问题...

  1. 首先,我将数组转换为单个字符串,每个值用逗号分隔(例如,["test 1", "test 2", "test 3"] 写为 “test 1,test 2,test 3”)。
  2. 接下来,我将新字符串输入到所需的 HTML 数据属性中。 (例如<div data-somedata="test 1,test 2,test 3"></div>
  3. 进入 JS 后,我检索该数据字符串并使用 jQuery 的“split”方法将其转换回数组。为此,请查看此处的代码段。

let stillString = $("[data-something]").attr('data-something');
console.log(stillString);

let nowArray = stillString.split(",");
console.log(nowArray);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<div data-something="test 1,test 2,test 3"></div>

这可能看起来不太漂亮,将数组保留为字符串,但它完成了工作,您的普通用户不会知道其中的区别。

注意:您不必使用逗号。你真的可以使用任何字符。唯一重要的是,您尝试分隔的值都不包含您选择将它们拆分的字符。

答案 3 :(得分:0)

尝试使用:

var services = "['service1', 'service2', 'service3']"
services = services .split(",");
services [0] = services [0].substring(1);
services [services .length - 1] = services [services .length - 1].substring(
  0,
  services [services .length - 1].length - 1
);
services .forEach((x, i) => {
  services [i] = services [i].includes('"') ? services [i].replaceAll('"', "").trim()
     : services [i].replaceAll("'", "").trim();
});

console.log(services );