2

サーバーからJSONをシリアル化および逆シリアル化する方法として、Json.NET(http://james.newtonking.com/projects/json/help/ )を使用しています。次のJSONオブジェクトがあるとしましょう。

{
    "user" : {
         "name" : "Bob",
         "age" : 35
    },
    "location" : "California"
}

これをネイティブタイプに逆シリアル化するために私が見つけることができる唯一の方法は、次のようにカスタムDTOを使用することです。

string jsonString = ""; // json string from above
Response result = JsonConvert.DeserializeObject<Response> (jsonString);

ここで、Responseクラスは次のようになります。

public class Response
{
    [JsonProperty("user")]
    public UserResponse User { get; set; }

    [JsonProperty("location")]
    public string Location { get; set; }
}

public class UserResponse
{
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("age")]
    public int Age { get; set; }
}

これをネイティブタイプに逆シリアル化したいのですが、JSON文字列がどのようになるかを常に把握しているとは限らない環境にいます...そのため、自分が何であるかが正確にわからない場合、カスタムDTOを使用するのは困難です。 mパイプを降りる。クラスをJsonConvert.DeserializeObject()に渡さないと、文字列やintなどのネイティブ型ではなくJson.NET型になります。これを回避する方法について何か提案はありますか?代わりに別のJSONライブラリを使用する必要がありますか?

ありがとう!

4

1 に答える 1

1

これですべての問題が解決するわけではありませんが (それは不可能です)、戻ってくるものに関する限られた情報で json を解析できるようにするソリューションを次に示します。

外側のレベルでは、Vehicle と呼ばれるオブジェクトを作成します。これには、車、ボート、飛行機が含まれます。Vehicle をリクエストしていますが、それが Car、Boat、Plane のいずれになるかはわかりません (これは、Vehicle の配列やその他のより複雑な応答を処理するために簡単に拡張できることに注意してください)。スキーマには、次のようないくつかのオプションがあります。

"id": "vehicle.schema.json",
"type": "object",
"required": true,
"additionalProperties": false,
"properties": {
    "Car": {
        "type": "object",
        "required": false
        //other properties
    },
              "Boat": {
        "type": "object",
        "required": false
        //other properties
    },
            "Plane": {
        "type": "object",
        "required": false
        //other properties
    }

上記は、プロジェクトに追加するスキーマ ファイルです。これらのいくつかが必要な場合は、以下の _schemaTypes 配列にタプルを追加するだけです。

   // code to set up your schema
  // Associate types to their JsonSchemas.  Order matters here.
  // After each parse, the schema is added to resolver, which is used in subsequent parses.
        _schemaTypes = new[]
        {
            Tuple.Create(typeof(Vehicle), "vehicle.schema.json"),
        }
        .ToDictionary(
            x => x.Item1,
            x => JsonSchema.Parse(
                File.ReadAllText(
                    Path.Combine(AppDomain.CurrentDomain.RelativeSearchPath ?? "",  @"Serialization\Schemas\") + x.Item2),
                    resolver));


 //method to return your deserialized object
 public T Deserialize<T>(IRestResponse response)
    {
        var schema = _schemaTypes[typeof(T)];

        T result = _serializer.Deserialize<T>(
                new JsonValidatingReader(
                    new JsonTextReader(
                        new StringReader(response.Content)))
                {
                    Schema = schema
                });
        return result;
    }

応答を解析すると、より一般的なオブジェクトが得られ、そこからコードを記述して、返されたより具体的なオブジェクトが何であったかを把握できます。私はこのタイプのアプローチを使用してjsonを解析しています。ここでは、いくつかのレベルのネストされたオブジェクトとオブジェクトの配列があり、かなり効果的です。

于 2012-11-09T23:24:48.277 に答える