2012-03-07 10 views
2

何か問題が生じた場合にエラーを含むjsonハッシュを返すAjax呼び出しがあります。ここでは例です:JSONハッシュを人間が読める文字列に変換する

this questionに基づいて
{"success":false,"errors":{"image":["file must be at least 1024x768px in size."]},"content_type":"text/json"} 

私はそうのように、私はこのハッシュの一部を印刷することができることを把握することができた:{"image":["file must be at least 1024x768px in size."]}

JSON.stringify(responseJSON.errors) 

は、しかし、これはまだのように、コードのハッシュとして出力します

私は本当に単純にこれを変換したい:

Image file must be at least 1024x768px in size. 

stringifyの後に.replaceを使用しないと、これを行う簡単な方法はありますか?ハッシュエラーは、例えば、より多くのエラーを含む可能性があることに注意してください:

{"image":["file must be at least 1024x768px in size."],"file":["type is invalid, must be jpg, png, or gif"]} 

アップデート:私はなぜ知らないが、responseJSONオブジェクトが渡された場合、以下に示す機能のいずれも文字列を返すんだろう。しかし、jQueryを使用してDOMに直接追加すると機能しました。ここに私がやってしまったものです:

// In the middle of an ajax callback 
$('.qq-upload-failed-text:last').append(': <span class="explanation"></span>'); 
formatErrors(responseJSON); 

// As a stand-alone function so it can be reused 
function formatErrors(response) { 
    $.each(response.errors, function(key, value) { 
    $('span.explanation:last').append(key + " " + value); 
    }); 
} 

それは正しくDOMにテキストを挿入するだろうが、Dampsquidの機能や他の人のいずれかを使用してのみ、空の文字列を返すのはなぜ私を超えています。あなたのJSONに基づいて

+0

オブジェクトをループして文字列を組み立てたいと思うようです。 – SLaks

+0

これは他のコードの真ん中にあるので、基本的にはエラーオブジェクトを渡して文字列を返すことができる単純な関数を作成します。 – Andrew

答えて

1

var myStr = "Image " + responseJSON.errors.image[0];

あなたはすべてのエラーを取得したいと、複数のそのになる場合:

var errors = ''; 
for(var i = 0; i<responseJSON.errors; i++) { 
    errors += responseJSON.errors[i] + ',' 
} 
+0

このアプローチでは、各メッセージの開始からのエラーのタイプを逃すと思います。 –

2

あなたがそうのようなエラーを反復処理することができます。

for (var name in responseJSON.errors) { 
    var message = responseJSON.errors[name]; 
} 

エラーメッセージをどのように表示するかわかりませんので、あらかじめお知らせします。しかし、これはJSONオブジェクトから必要な情報を得るのに十分なはずです。

2

エラーを繰り返し処理し、要素に追加します。

$("#errors").empty(); 
$.each(responseJSON.errors, function(key, value) { 
    $("#errors").append("<div>" + key + " " + value + "</div>"); 
}); 
0

JSONレスポンスは実際にはオブジェクトなので、そのプロパティを読み取ることができます。 responseJSON.errorsと同じように、responseJSON.errors.image[0]を読むと、JSONレスポンスのerrorsサブオブジェクトのイメージ配列の最初の項目を読み取ることができます。

0

オブジェクトを文字列にして後で文字列メソッドを適用するのではなく、オブジェクトをループオーバーする方がよい場合があります。

var json = {"image":["file must be at least 1024x768px in size."],"file":["type is invalid, must be jpg, png, or gif"]}, 
    output = []; 

for(var key in json) { 
    output,push(key + ' ' + json[key]); 
} 

output = ouput.join('<br />'); 
0

このタイプのタスクでは、すばらしいunderscore.jsライブラリを使用する傾向があります。(あなたはこれを実装している場所、あなたはネイティブ配列reduce()機能に似た何かができるによって

image file must be at least 1024x768px in size. 
file type is invalid, must be jpg, png, or gif 

:これは、のようなものを返します

function parseErrors(responseJSON) { 
    var errs = JSON.stringify(responseJSON.errors), 
    errStr = _(errs).reduce(function (memo, str, key) { 
     return memo + "\n" + key + " " + str; 
    }, ''); 
    return errStr.replace(/^\n/, ''); 
} 

:次に、あなたは、次のような何かを行うことができますMDN documentationを参照)。

また、必要に応じて、改行「\ n」をHTML改行要素<br />に置き換えることもできます。

1
var response = {"image":["file must be at least 1024x768px in size."],"file":["type is invalid, must be jpg, png, or gif"]}; 

var errors = ""; 
for (var prop in response) { 
    errors += prop + ": " + response[prop] + "\n"; 
} 
alert(errors); 

の作業例:http://jsfiddle.net/zFdmZ/3/

+0

私はjsonオブジェクト 'responseJSON'で始めています。これは' responseJSON.errors'のように '.errors'を呼び出してエラーオブジェクトを取得しています。何らかの理由で私があなたの例のようにこれを行うとき、すなわち。 'var response = responseJSON.errors'であれば、空の文字列だけを返します。何か案は? – Andrew

+0

+1のフィドル、btw。 – Andrew

+0

'JSON.stringify(responseJSON、null、4)をログに記録するか、警告すると、データの構造がわかります。あなたはresponseJSON.errorsなどで同じことを行います – Sean

1

相続人は、単純な純粋なJSソリューション、

また、エラーの各タイプが可能なエラーテキストの配列を持っていることを考慮に入れています。

JSFiddle

function FormatErrors(response)         
{ 
    var s = ""; 
    for(var name in response.errors) 
    { 
     s += "<p><span class='error'>" + name + ":</span> "; 
     s += response.errors[name].join("</p><p><span class='error'>"+name+ ":</span> "); 
     s += "</p>"; 
    } 
    return s; 
}                 

編集:簡単なCSSの書式設定を追加し、別の要素の中に挿入できるように文字列を返すように更新

。フィドルも更新されました。

+0

私は文字列を返す関数を作って、レスポンスオブジェクトを取得して挿入するさまざまなコールバックなどに簡単に組み込むことができますエラーメッセージをDOMに送ります。 – Andrew

+0

あなたの考えはうまくいくと思われますが、なんらかの理由でそれはしません。返す前に 'console.log(s)'を置くと、 '[空の文字列]'が表示されます。何らかの理由で、関数内で呼び出されたときに、キーと値が文字列に変換されません... – Andrew

+0

フィドルでうまくいきます! – Dampsquid

関連する問題