4

まず、JSONの逆シリアル化について別の質問をして申し訳ありません。しかし、私はこれに対する答えを見ていません。

JSONを次のように再帰的に定義されてTいる場所に逆シリアル化したいと思います。T

  • Dictionary<string, T>
  • T[]
  • string
  • プリミティブ型
  • (object)T(箱入り)

そこにあるJSONライブラリの多くで逆シリアル化された型を指定できることは知っていますが、私の経験では、カスタム型(JObject、、JsonObjectなど)がオブジェクトグラフのどこかに表示されます(つまり、戻り型は特定の深さ)。タイプはJavaScriptとほぼ1対1でマップされるため、簡単に思えます。

編集

理想的には、JSONを「クリーン」にする、つまり、逆シリアル化を支援する特別なフィールド( "__type"など)を使用しないようにします。これは、JavaScriptからの単純なマッピングである必要があります:JObject-> IDictionary<string, T>JArray->T[]など。

その間、私はFParsecパーサーと手巻きシリアライザーを使用しています。それはうまく機能しますが、私はこれのためにすでにそこに何かがあるかもしれないと思いました。

4

2 に答える 2

0

「JSONをTにデシリアライズしたいのですが、Tは再帰的に定義されています」とはどういう意味かよくわかりません。上記のタイプのいずれかをシリアライズおよびデシリアライズできるようにしたいと考えています。任意の組み合わせで。

System.Runtime.Serialization.Json私の経験では、特にで利用可能な標準のDotNetライブラリはDataContractJsonSerializer、あなたが説明する仕事に十分であり、1つを除いてあなたが言及するすべてのタイプ(メタデータの説明なし)をうまく処理できることを示しています。Tのボックス化されたオブジェクト。ただし、私の仮定では、メタデータを提供せずにTのボックス化されたオブジェクトを処理できるライブラリはありません(どうすればよいですか?オブジェクトについて何も知りません)

これが私のアプリでシリアル化を提供するために使用するいくつかのコードです

public class JSONSerializer<T>
{

    public static string Serialize(T obj)
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream stream = new MemoryStream()) {
            serializer.WriteObject(stream, obj);
            return Encoding.Default.GetString(stream.ToArray());
        }
    }

    public static T Deserialize(string json)
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream stream = new MemoryStream(Encoding.Default.GetBytes(json))) {
            return (T)serializer.ReadObject(stream);
        }
    }

}

PS:DataContractSerializerは、プロキシタイプのオブジェクトを使用せずに「純粋な」シリアル化と逆シリアル化を実行することにも注意してください(少なくとも出力または入力ではなく、おそらく内部のどこかで)。

于 2012-04-18T06:51:48.247 に答える
-1

ジェネリックは使えません。これは、ジェネリックがコンパイル時に単一の型に取り除かれる必要があるためです。ただし、JSON オブジェクトまたは配列の値は任意の JSON 型である必要があり、競合します。

ただし、必要に応じて使用objectしてからキャストできます。JSON 配列はobject[]で、JSON オブジェクトはDictionary<string,object>. しかし、これはあなたが言及したカスタムタイプのバリエーションにすぎません。

于 2012-04-18T07:48:11.990 に答える