3

Windows 8 用のニュース アプリを開発しています (C#、XAML)。残念ながら、JSON フィード ( http://jsonlint.com/で検証済み) を非同期でダウンロードした後、奇妙なエラーが発生しました。ダウンロードが成功し、結果を解析したい: var items = Windows.Data.JsonArray.Parse(result);.

コードを実行すると、次のエラーが表示されます。

Invalid character at position 0.Invalid JSON string.

Json.JsonArray は、Microsoft の新しいライブラリです。同じエラーで Newtonsoft の JSON ライブラリも試しました。私は何を間違っていますか?

これは完全なコードです:

// Retrieve recipe data from Azure
var client = new HttpClient();
client.MaxResponseContentBufferSize = 1024*1024; // Read up to 1 MB of data
var response = await client.GetAsync(new Uri("http://contosorecipes8.blob.core.windows.net/AzureRecipes"));
var result = await response.Content.ReadAsStringAsync();

// Parse the JSON recipe data
var recipes = JsonArray.Parse(result.Substring(1, result.Length - 1));

このコード スニペットは、Microsoft ハンズオン ラボ (Contoso CookBook) からのものです。ソースに「[」と「]」を入れずに試してみました(効果なし)...

ありがとうございました!

4

2 に答える 2

6

これを使用して、結果をダウンロードして解析することができました:

static async Task<JsonValue> DownloadJsonAsync(string url)
{
    var client = new HttpClient();
    client.MaxResponseContentBufferSize = 1024 * 1024;
    var data = await client.GetByteArrayAsync(new Uri(url));
    var encoding = Encoding.UTF8;
    var preamble = encoding.GetPreamble();
    var content = encoding.GetString(data, preamble.Length, data.Length - preamble.Length);
    var result = JsonValue.Parse(content);
    return result;
}

応答の BOM が正しく処理されていなかった'\xfeff'ため、最初に文字がパーサーを強制終了したようです。プリアンブルを取り除いて解析すると問題なく読み取れます。それ以外の場合はそのまま解析すると、メッセージとともに がスローされFormatExceptionます: Encountered unexpected character 'ï'.

于 2012-06-08T16:13:49.137 に答える
1

少し修正した後、コードを実行できました。UTF8 文字列のバイト オーダー マークは、Windows.Data.Json の JsonArray.Parse() で問題を引き起こすようです。

追加のエンコーディングを使用せずに解決する方法は、ReadAsStringAsync() の後に BOM 文字を置き換えることです。

result = result.Replace('\xfeff', ' ');

またはそれ以上

if (result.Length > 1 && result[0] == '\xfeff'){
    result = result.Remove(0, 1);
}
于 2012-06-08T18:08:06.070 に答える