ナンシーを使用してデータベース検索を行い、結果をJSONとして返すサービスを作成しました。ここではテストコードです:JSONレスポンスに余分な文字が含まれています
using (var dt = new DataTable("MyData"))
{
dt.Columns.Add("id");
dt.Columns.Add("password");
dt.Columns.Add("body", System.Type.GetType("System.String"));
dt.Columns.Add("balance", System.Type.GetType("System.Double"));
dt.Rows.Add(uid, pwd, "Some useful content", 33.75);
dt.Rows.Add(uid, pwd, "More useful content", 128.55);
if (dotNetDataTable)
json = JsonConvert.SerializeObject(dt, new Serialization.DataTableConverter());
else
json = JsonConvert.SerializeObject(dt);
json = "{\"status\":\"success\",\"data\":" + json + "}";
return Response.AsJson(json);
}
だけで復帰する前にプロセスを中断し、JSONのポーリング値、私が取得:
"{\"status\":\"success\",\"data\":[{\"id\":\"RMittelman\",\"password\":\"Password\",\"body\":\"Some useful content\",\"balance\":33.75},{\"id\":\"RMittelman\",\"password\":\"Password\",\"body\":\"More useful content\",\"balance\":128.55}]}"
これは、イミディエイトウィンドウで正しいようです。私は、データを受信し、プロセスを中断すると、私はクライアントイミディエイトウィンドウでこれを取得する:あなたが見ることができるよう
"\"{\\\"status\\\":\\\"success\\\",\\\"data\\\":[{\\\"id\\\":\\\"RMittelman\\\",\\\"password\\\":\\\"Password\\\",\\\"body\\\":\\\"Some useful content\\\",\\\"balance\\\":33.75},{\\\"id\\\":\\\"RMittelman\\\",\\\"password\\\":\\\"Password\\\",\\\"body\\\":\\\"More useful content\\\",\\\"balance\\\":128.55}]}\""
は余分先頭と末尾の引用符、余分なバックスラッシュの束が含まれています。 JSONはデシリアライズしません。私はプログラム的に先頭と末尾の引用符を削除し、すべてのバックスラッシュ、それが正常に動作している場合
json result:
"{\"status\":\"success\",\"data\":
[{\"id\":\"RMittelman\",\"password\":\"Password\",\"body\":\"Some useful content\",\"balance\":33.75},
{\"id\":\"RMittelman\",\"password\":\"Password\",\"body\":\"More useful content\",\"balance\":128.55}]}"
Unexpected JSON token when reading DataTable. Expected StartArray, got String. Path '', line 1, position 240.
:ここでは、クライアントのテキストボックスに表示される結果があります。ここで は、私がデータを取得するために、クライアントで使用したコードです:
string GET(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
try
{
WebResponse response = request.GetResponse();
using (Stream responseStream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
string responseText = reader.ReadToEnd();
isError = false;
return responseText;
}
}
catch (WebException ex)
{
isError = true;
WebResponse errorResponse = ex.Response;
if (errorResponse == null)
return ex.Message;
using (Stream responseStream = errorResponse.GetResponseStream())
{
StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
String errorText = reader.ReadToEnd();
return errorText;
}
throw;
}
}
そこで問題は、なぜそれが送信される前にOKに見えますが、送信した後に、すべてのジャンクを含まないですか?
途中でJSON文字列をダブルエンコードしているようです。 1レベルのJSONエンコーディングを削除します。 – Tomalak
これは私にとって紛らわしいものです。サービスから元のJSON文字列を返す直前の、最初の直接的なウィンドウ結果が正しいように見えます。私はそれが引用符とスラッシュを表示していることを知っているが、それは即時のウィンドウのものですよね?それは受信した後の2番目のもので、余分な数字がすべて含まれています。私はポストして受信するための.Netコードを書いていない、Googleからそれを得た。しかし、JSONエンコーディングは含まれていないようです。私はレスポンスを返す直前にどうしていいように見えるのか分かりませんが、受信後に余計なゴミがあります。おそらく、何らかの文字エンコーディングが行われているのでしょうか? – RMittelman
JSONを二重シリアル化しています。 (クラスをJSONにシリアル化し、JSONを文字列リテラルとしてシリアライズします。)おそらくhttps://stackoverflow.com/questions/7597035/returning-a-string-containing-valid-json-with-nancyやhttps:/ /stackoverflow.com/questions/33983600/why-can-i-not-register-a-custom-json-net-implementation-in-nancy – dbc