2012-11-21 107 views
4

我做一個winJS.xhr這樣的JSON解析:如何在Windows 8

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 
+0

你可以簡單地解析它在JavaScript obj = JSON.parse(json); json是json的對象...... – AurA

+2

@AurA:這沒有用,他在他的問題的最後一行中是這樣說的。 – Cerbrus

+0

json解析意外字符是由於解析已解析的對象...不是解析JSON字符串可以在[this post]中找到更多幫助(http://stackoverflow.com/questions/8524933/json-parse -unexpected-character-error) – AurA

回答

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是否爲stringobject。 (如果它是一個字符串,我會說JSON.parse應該已經工作)
然後登錄jsonResult本身,看看你是否可以通過它的屬性。 (谷歌瀏覽器控制檯的工作像這樣的魅力)

如果它是一個字符串,這是一個(有點哈克,不安全)的方式來做到這一點:

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

(感謝@ ThiefMaster♦對於一些更合適(-ish)使用eval,而不是我自己的虐待它。)
然後,您應該能夠訪問result
一般情況下,你希望使用eval,但如果一切都失敗了...

+0

我認爲OP已經暗示他的'jsonResult'很可能是一個字符串,否則'jsonResult [0]'不會返回'{'。 – Passerby

+0

@Passerby:添加了一個選項,如果是這樣的話。 – Cerbrus

+0

-1使用eval解析json,另一個-1如果我可以將變量賦值放入eval中。不幸的是,如果OP無法從遠程系統獲得有效的JSON,那麼使用eval可能是一條路。嗯,仍然是-1的變量賦值裏面的eval是醜陋/壞,不管是什麼。但是,假設WinJS可以使用eval訪問用戶的*系統*,可能是任意的JS,這是一個非常糟糕的主意。 – ThiefMaster

6

您看到的字符串實際上並不是有效的JSON,因爲它的屬性名稱未被引用。這就是爲什麼JSON.parse拋出一個錯誤。

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字符串應該使用雙引號"附上一切可能的地方。

其實這也發生在PHPjson_decode

我不知道Win8JS的發展,所以我不確定你是否可以使用response.responeJSON或類似的東西,但直接解析response.responseText似乎可能會失敗。

如果您確實需要使用responseText,請考慮@Cerbrus的危險eval方法。

+0

- 它現在被修改爲*稍微不那麼危險*(tm) – Cerbrus

+0

@Cerbrus它是_tradition_說'eval'是危險的:)實際上[MDN建議'eval'在舊瀏覽器上模仿JSON] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/JSON#Browser_compatibility)。 – Passerby

+0

哦,如果MDN甚至使用'eval'(危險!),我想我們別無選擇。 放棄希望,所有在這裏'評估'的人。 – Cerbrus

-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; 
      } 
     } 

    } 
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) { } 
); 
0

首先做的事:

jsonResult = JSON.parse(response.responseText); 

,然後你可以使用:

var rhs = jsonResult.rhs;