如何用数字解析JSON作为键

时间:2014-05-08 21:16:35

标签: javascript json

我有以下json,遗憾的是我无法控制此输出。

{
"questions": {
    "9733": {
        "text": "Star Trek or Star Wars?",
        "answers": {
            "41003": "Star Trek",
            "41004": "Star Wars",
            "41005": "Neither is superior in my opinion; both great in their own ways",
            "41006": "Not a fan",
            "41007": "I don't have an opinion on this"
        }
    },
    "25272": {
        "text": "Which of these summer movies are you looking forward to the most?",
        "answers": {
            "99545": "World War Z",
            "99546": "Monsters University ",
            "99547": "White House Down",
            "99548": "Man of Steel",
            "99549": "Lone Ranger",
            "99550": "The Wolverine"
        }
    },
    "27547": {
        "text": "Should the U.S. attack Syria?",
        "answers": {
            "107453": "Yes",
            "107454": "No"
        }
    }
}
}

我正在使用json.parse来解析它。要获得第一个问题的文本,我通常会做这样的事情。

var jsonData = JSON.parse(data);//Where data = the json above
console.log(jsonData.questions.9733.text);//Obviously this fails

然而,javascript显然不喜欢那个数字。您如何建议访问第一个问题的文本?我宁愿在一系列问题中更好地设置json。不幸的是,我无法控制这个JSON的输出。

我也不会意识到他们遇到的键是什么,但那是另一个问题。我愿意接受任何关于如何解析这个东西的建议,因为我从来没有必要解析这样一个奇怪的JSON输出。

5 个答案:

答案 0 :(得分:9)

您需要使用bracket notation

console.log(jsonData.questions["9733"].text);

但是因为括号内的值会自动转换为字符串,所以也可以这样做:

console.log(jsonData.questions[9733].text);

但请注意,使用非字符串作为属性名称通常是错误的形式,可能会导致一些细微的问题,例如:如果属性名称为"001",则[001]工作。

答案 1 :(得分:2)

我相信您可以通过与数组中相同的语法访问数据:

console.log(jsonData.questions[9733].text);

答案 2 :(得分:2)

为什么不试试?

jsonData["questions"]["9733"]

How to access a numeric property?

答案 3 :(得分:1)

如果你必须使用数字作为键...你可以像这样访问它们:

var text = jsonData.questions["9733"].text;

编辑:您也可以使用编号9733访问它。它不必是字符串。如果密钥是非数字,则只需要是字符串。

答案 4 :(得分:0)

尝试使用Ason,如果您使用的是Java 8. Gradle依赖编译' org.arivu:ason:1.0.3'。

Java代码如下

Ason ason = new Ason();
Object json = ason.fromJson("<<JSON String!>>");
System.out.println(Ason.getJson(json, "questions.9733.text", null)):