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ます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がaであるstringか。であるかを確認してくださいobject。(文字列の場合は、機能するはずですJSON.parse
次に、ログに記録jsonResultして、そのプロパティを確認できるかどうかを確認します。(グーグルクロームコンソールはこれの魅力のように機能します)

文字列の場合、これは(ややハッキーで安全ではない)方法です。

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

(@ ThiefMaster♦のおかげevalで、私自身の悪用の代わりに、より適切な(-ish)使用が可能になりました。)
その後、アクセスできるようになるはずです。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 に答える