9

正常に動作する次のクラスを使用して、JSON文字列をルートオブジェクトに逆シリアル化します。

[Serializable]
    public class MoviesListRootObject
    {
        public int count { get; set; }
        public Pagination pagination { get; set; }
        public List<Response> response { get; set; }
    }

...................................

var json = wc.DownloadString(jsonRequestURL);
var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json);

しかし、ルートオブジェクトを一般化して親クラスを作成し、それから継承すると、逆シリアル化後にnullになります!!!!

[Serializable]
    public class RootObject
    {
        public int count { get; set; }
        public Pagination pagination { get; set; }
    }

[Serializable]
    public class MoviesListRootObject:RootObject
    {
        public List<MovieResponse> movieResponse { get; set; }

    }

.............................................。

 var json = wc.DownloadString(jsonRequestURL);
 var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json);
4

2 に答える 2

4

これは非常にシンプルで、json.net によって提供されるすぐに使えるサポートです。シリアライズおよびデシリアライズ中に次の JsonSettings を使用するだけです。

JsonConvert.SerializeObject(graph, Formatting.None, new JsonSerializerSettings() {
    TypeNameHandling = TypeNameHandling.All,
    TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
});

Deserializing以下のコードを使用します。

JsonConvert.DeserializeObject(Encoding.UTF8.GetString(bData), type,
    new JsonSerializerSettings() {
    TypeNameHandling = TypeNameHandling.All
});

JsonSerializerSettings オブジェクトの初期化子に注意してください。これはあなたにとって重要です。

于 2014-01-14T10:06:44.397 に答える
0

json文字列が次のようになっていると仮定します

{"movieResponse":[{"Rating":"Good"}],"count":1,"pagination":{"PageIndex":1}}

私はそれがうまくいくと思います。現在Json.net 4.5 r11を使用しています

クラス構造が次のように見えるときにオブジェクトをシリアル化した場合

[Serializable]
public class MoviesListRootObject
{
        public int count { get; set; }
        public Pagination pagination { get; set; }
        public List<Response> response { get; set; }
}

そしてjson文字列は以下のようになります

{"count":1,"pagination":{"PageIndex":1},"response":[{"Rating":"Good"}]}

そして、新しい構造を使用してデシリアライズするとmovieResponse、新しい構造でプロパティが変更されるため、null が返されます。

この問題を解決するには、オブジェクトから派生した新しいカスタム jsonConverterJsonConverterを作成し、プログラムでオブジェクトを作成します。リンクjson-deserialization-with-jsonnet-classを見て、アイデアを得てください。これについて既に知っていて、問題がまだ存在する場合は、使用されている Json.net バージョン、json 文字列、完全なクラス構造などの詳細で質問を更新してください。

HTH。

于 2012-12-05T10:44:30.660 に答える