14

JSON シリアル化を使用するように WCF を構成し、DataTable を DataContract の 1 つに含めると、DataContract 全体を JSON にシリアル化する前に DataTable を XML にシリアル化します。DataTable を XML ではなく JSON としてシリアル化する必要があります。

私の質問は次のとおりです。

  1. 最初に DataTable を XML にシリアル化するのはなぜですか?
  2. 代わりに JSON にシリアル化するにはどうすればよいですか?
4

4 に答える 4

14
  1. DataTable は純粋な .NET コンストラクトであり、JSON によるロスレスな方法で (簡単に) 表すことはできません。DataTables には、JSON が保存できない多くの追加情報が含まれています: 主キー、autoinc、null の許可、キャプション、データ型、インデックスなど。DataTable を .NET でネイティブにシリアル化できる唯一の方法は、XML/バイナリへのシリアル化です。この XML シリアル化された DataTable は、JSON にシリアル化されます。

  2. JSON.NETまたはFastJSONを使用して、DataTable をプレーンでクリーンな JSON 互換バージョンの DataTable に変換します。これは、.NET WCF クライアントだけでなく、任意の JSON クライアントで使用できます。上記の (1) で説明したすべての DataTable カスタム プロパティが失われ、フィールド名/値の JSON ペアのみが取得されます。この方法での格納は、すべての行でフィールド名が重複するため非効率的です。

DataContract で DataTable を使用しないでください。DataTable の利点が必要で、クライアントが常に .NET になる場合は、バイナリ シリアル化を介して DataTable をバイト配列にシリアル化し、必要に応じて結果のシリアル化されたバイト ストリームを圧縮します。DataContract でバイト配列を公開します。これにより、DataTable の簡易 JSON バージョン ((2) で提供される) ではなく、クライアント側で効率的で完全にロスのないバージョンの DataTable (解凍およびバイナリ デシリアライゼーションの後) が得られます...

于 2013-07-29T18:06:02.557 に答える
6

これを試して:

public string ConvertDataTabletoString(System.Data.DataTable dt)
{
    System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
    Dictionary<string, object> row;
    foreach (System.Data.DataRow dr in dt.Rows)
    {
        row = new Dictionary<string, object>();
        foreach (System.Data.DataColumn col in dt.Columns)
        {
            row.Add(col.ColumnName, dr[col]);
        }
        rows.Add(row);
    }
    return serializer.Serialize(rows);
}
于 2015-03-07T11:04:32.003 に答える
4

同じ問題がありました。データセットから Json に変換する際に、wcf サービスが json を適切にフォーマットしていませんでした。次のソリューションを使用して機能させました。

using System.ServiceModel.Channels;
using System.ServiceModel.Web;

dsData は私のデータセットです

string json = Newtonsoft.Json.JsonConvert.SerializeObject(dsData);
return WebOperationContext.Current.CreateTextResponse(json, "application/json;charset=utf-8", System.Text.Encoding.UTF8);

「メッセージ」が戻り型になります。

于 2015-12-24T04:09:37.980 に答える
2

そのホームページのチャートによると、Json.NETが本当に唯一の選択肢であり、 NuGetからすぐに入手できます。幸いなことに、これは優れたライブラリであり、非常に使いやすいです。

string json = JsonConvert.SerializeObject(myDataSet, new DataSetConverter());

Rich Strahlには詳細な素晴らしい投稿がありJavaScriptSerializer、比較のために (かなり大規模な) カスタム コンバーターで使用したカスタム作業もいくつか含まれていることに注意してください。

于 2013-07-29T16:12:11.310 に答える