4

我正在做这样的 winJS.xhr:

var jsonResult;
WinJS.xhr(
{
    url: urlGoogle,
    responseType: 'json'
}
).done(function complete(response) {
    jsonResult = response.responseText;

    console.log(jsonResult);
}, 
//Error and Progress functions
);

控制台日志向我显示:

{lhs: "32 Japanese yen",rhs: "0.30613818 Euros",error: "",icc: true}

我想获取 rhs 信息。所以我试着做

console.log(jsonResult.rhs); 

console.log(jsonResult['rhs']);

它只显示“未定义”。然后我意识到,当我执行 jsonResult[0] 时,它会向我显示第一个字符(即 { ),依此类推,并带有索引括号。

我试图做一个 JSON.parse(jsonResult); 但它会产生错误

json parse unexpected character
4

6 回答 6

6

您看到的字符串实际上不是有效的 JSON,因为它的属性名称没有被引用。这就是JSON.parse抛出错误的原因。

于 2012-11-21T08:18:03.533 回答
2

刚刚在 Chrome 开发工具上尝试过:

JSON.parse("{lhs: \"32 Japanese yen\",rhs: \"0.30613818 Euros\",error: \"\",icc: true}")
SyntaxError: Unexpected token l
JSON.parse('{lhs: "32 Japanese yen",rhs: "0.30613818 Euros",error: "",icc: true}')
SyntaxError: Unexpected token l
JSON.parse('{lhs: "32 Japanese yen",rhs: "0.30613818 Euros",error: "",icc: 1}')
SyntaxError: Unexpected token l
JSON.parse('{"lhs": "32 Japanese yen","rhs": "0.30613818 Euros","error": "","icc": true}')
Object
    error: ""
    icc: true
    lhs: "32 Japanese yen"
    rhs: "0.30613818 Euros"
    __proto__: Object

所以看起来一个“有效”的 JSON字符串应该使用双引号"来包围每个可能的地方。

其实这也发生在PHP's上json_decode

我不了解Win8JS开发,所以不确定你是否可以使用response.responeJSON或类似的东西,但直接解析response.responseText似乎可能会失败。

如果您确实需要使用responseText,请考虑@Cerbrus 的危险eval方法。

于 2012-11-21T08:19:02.793 回答
1
var test = {lhs: "32 Japanese yen",rhs: "0.30613818 Euros",error: "",icc: true}
//test.lhs returns "32 Japanese yen"

我不太确定为什么这对你不起作用。尝试记录console.log(typeof jsonResult)jsonResult 是 astring还是 a object。(如果它是一个字符串,我会说JSON.parse应该可以工作)
然后记录jsonResult它自己,看看你是否可以遍历它的属性。(谷歌浏览器控制台就像一个魅力)

如果它是一个字符串,这是一种(有点hacky,不安全)的方法:

var result = eval('({lhs: "32 Japanese yen",rhs: "0.30613818 Euros",error: "",icc: true})')
var result = eval('(' + jsonResult + ')')

(感谢@ThiefMaster♦ 更恰当地使用(-ish)eval代替我自己滥用它。)
然后您应该能够访问result
通常,您不想使用eval,但如果所有其他方法都失败了......

于 2012-11-21T08:06:51.357 回答
1

在您的情况下,请检查以下内容

WinJS.xhr({ url: urlGoogle }).then(
           function completed(response) {
                var jsonString = JSON.parse(response.responseText);
                console.log(jsonString .rhs);
           },
           function error(error) { console.log(error) },
           function progress(progress) { }
);

OR

WinJS.xhr({ url: urlGoogle }).then(
           function completed(response) {
                var jsonString = JSON.parse(response.responseText);
                 console.log(jsonString .rhs); 
           },
           function error(error) { console.log(error) },
           function progress(progress) { }
);
于 2013-02-28T06:25:25.393 回答
0

首先做:

jsonResult = JSON.parse(response.responseText);

然后你可以使用:

var rhs = jsonResult.rhs;
于 2014-02-05T01:32:03.967 回答
-1

我过去曾在博客上写过这个。下面的代码调用返回 JSON 的 Web 服务。

这里解释:http: //blogs.msdn.com/b/brunoterkaly/archive/2012/11/06/step-4-augmented-reality-windows-8-and-cloud-computing-how-to-implement -with-real-code-implementing-the-windows-8-client.aspx#

此代码的有用之处在于您“尝试”获取值。它们可能不存在。

请参阅 parsedResults.TryGetValue()。

    private async System.Threading.Tasks.Task CallLocationWebService(string gps)
    {
        // Call into the emulator. This assumes you are running the
        // cloud project from the last post in the backgruond
        string _location = "http://127.0.0.1:81/api/values?location={0}";

        // You can use the line below once you deploy your cloud
        // application to the cloud (a MS data center)
        //string _location = "http://locationwebservice.cloudapp.net/api/values?location={0}";

        // Now make the aynchronous call. We need to pass the GPS
        // parameters here to the _location string mentioned above.
        using (HttpClient clientlocation = new HttpClient())
        using (var response = await clientlocation.GetAsync(string.Format(_location, gps)))
        {
            if (response.IsSuccessStatusCode)
            {
                string webresponse = await response.Content.ReadAsStringAsync();

                // Parse the string into a JSONObject
                var parsedResults = JsonObject.Parse(webresponse);

                IJsonValue val;

                // Extract data embedded in JSONObject.
                // Assign to controls in user interface
                if (parsedResults.TryGetValue("latitude", out val))
                    loc_info.latitude = val.GetString();
                if (parsedResults.TryGetValue("longitude", out val))
                    loc_info.longitude = val.GetString();
                if (parsedResults.TryGetValue("bus_and_neighborhood", out val))
                    loc_info.bus_and_neighborhood = val.GetString();
                if (parsedResults.TryGetValue("elevation", out val))
                    loc_info.elevation = val.GetString();
                if (parsedResults.TryGetValue("bus_and_neighborhood", out val))
                    loc_info.bus_and_neighborhood = val.GetString();
                if (parsedResults.TryGetValue("max_temp", out val))
                    loc_info.max_temp = val.GetString();
                if (parsedResults.TryGetValue("min_temp", out val))
                    loc_info.min_temp = val.GetString();

                this.bus_and_neighborhood.Text = loc_info.bus_and_neighborhood;
                this.elevation.Text = loc_info.elevation;
                this.latlong.Text = loc_info.latitude + "/" + loc_info.longitude;
                this.max_temp.Text = loc_info.max_temp;
                this.min_temp.Text = loc_info.min_temp;
            }
        }

    }
于 2012-12-04T03:41:17.483 回答