3

私がやろうとしていること:

文字列、int、double、またはこれらのいずれかのリストである可能性のある値を持つ json オブジェクトがあります。これらの json 文字列を C# オブジェクトに逆シリアル化しようとしていますが、それらは複数の型を持つ可能性があるため、厳密に型指定された代替オブジェクトではなく、汎用オブジェクトを使用して立ち往生しています。

私の問題: ServiceStack.Text.JsonSerializer.DeserializeFromString(jsonString) 関数が T = object の場合に奇妙に動作するように見えます。常に物事を文字列として扱い、引用符では機能しません。

次に例を示します。

string json1 = "[1]";
string json2 = "[1,2]";
string json3 = "['hello']";
string json4 = "['hello','world']";
string json5 = "[\"hello\"]";
string json6 = "[\"hello\",\"world\"]";
object o1 = JsonSerializer.DeserializeFromString<object>(json1);
object o2 = JsonSerializer.DeserializeFromString<object>(json2);
object o3 = JsonSerializer.DeserializeFromString<object>(json3);
object o4 = JsonSerializer.DeserializeFromString<object>(json4);
object o5 = JsonSerializer.DeserializeFromString<object>(json5);
object o6 = JsonSerializer.DeserializeFromString<object>(json6);

予想される基本オブジェクト:

object    type           value
o1        List           [1]
o2        List           [1,2]
o3        List           ['hello']
o4        List           ['hello','world']
o5        List           ["hello"]
o6        List           ["hello","world"]

実際の基礎となるオブジェクト:

object    type           value
o1        String         "[1]"
o2        String         "[1,2]"
o3        String         "['hello']"
o4        String         "['hello','world']"
o5        String         "["
o6        String         "["

参考までに、Newtonsoft.Json を使用する対応するコード ブロックは、基になるオブジェクトを Netwonsoft.Json.Link.JArray として解釈します。

現在のところ、json で単一引用符が使用されていることを確認し、すべてが適切に抽出されるまで、再帰的に抽出された文字列を逆シリアル化する必要があります。

これを ServiceStack.Text を使用したい方法で動作させるためにできることはありますか?

4

1 に答える 1

3

ServiceStack のテキスト シリアライザーは、JSON を指定されたスキーマに変換することによって機能します。オブジェクトを使用する場合、事前に型を推測することはできません。そのため、実行時にこれを行うには、ServiceStack の JSON シリアライザーが独自の__typeメタデータ プロパティを発行する必要があります。 deserializer 何にデシリアライズするか。これはJSONオブジェクトリテラルに対してのみ発行され、配列に対しては発行されないため、ここでは機能しません。

配列を逆シリアル化するいくつかの方法を次に示します。

string json6 = "[\"hello\",\"world\"]";

var list = json6.FromJson<List<string>>();
list.PrintDump();

var array = json6.FromJson<string[]>();
array.PrintDump();

var arrayObj = json6.FromJson<object[]>();
arrayObj.PrintDump();
于 2013-03-11T19:49:53.167 に答える