web-dev-qa-db-ja.com

JSON.netを使用してJSONを匿名オブジェクト[]に解析します

オブジェクトに解析したいjson文字列があります[]:

{ "Thing":"Thing","That":{"Item1":15,"Item2":"Moo","Item3":{"Count":27,"Type":"Frog"}}}

結果の匿名オブジェクト配列には、元のjsonオブジェクトの各プロパティが含まれている必要があります。私の問題は、JsonConvert.DeserializeObjectがJContainerまたはJObjectのタイプを返すことです。プレーンなVanillac#オブジェクトを返す方法を特定できませんでした。

これは、以前の一連の試みからの現在の機能しないコードです。 JSON.netを使用する必要はありませんが、可能であれば、jsonを生成するコードとの互換性を確保したいと思います。

JObject deserialized = JsonConvert.DeserializeObject<JObject>(dataString);
object[] data =
deserialized.Children().Where(x => x as JProperty != null).Select(x => x.Value<Object>()).ToArray();

更新

生成されたオブジェクト配列を使用して、リフレクションを介してメソッドを呼び出しています。解析されたjsonオブジェクトのタイプは、実行時には不明です。問題のこだわりは、JObjectまたはJContainerオブジェクトタイプが呼び出されるメソッドのシグネチャと一致しないことです。ダイナミックにも同じ副作用があります。メソッドは次のように呼び出されます。

Type _executionType = typeof(CommandExecutionDummy);
CommandExecutionDummy provider = new CommandExecutionDummy();
var method = _executionType.GetMethod(model.Command,
               BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
if (method == null)
   throw new InvalidCommandException(String.Format("Invalid Command - A command with a name of {0} could not be found", model.Command));
return method.Invoke(provider, model.CommandData);
15
Ritz

次のような匿名タイプを使用して、例で逆シリアル化できます。

string jsonString = "{name:\"me\",lastname:\"mylastname\"}";
var typeExample = new { name = "", lastname = "",data=new int[]{1,2,3} };
var result=JsonConvert.DeserializeAnonymousType(jsonString,typeExample);
int data1=result.data.Where(x => 1);

Json.Netの他の方法では、次のような動的オブジェクトを使用しています。

dynamic result2=JObject.Parse(jsonString);
18
majimenezp

JSON文字列が匿名型の配列であるわずかに異なるユースケースは、次のように機能します。基本的には、匿名型を配列内にラップするだけです。

string json = "[{\"Type\":\"text/xml\",\"Allowed\":\"true\"},{\"Type\":\"application/pdf\",\"Allowed\":\"true\"},{\"Type\":\"text/plain\",\"Allowed\":\"true\"}]";
JsonConvert.DeserializeAnonymousType(json, new[] { new { Type = "", Allowed = true } });

これにより、 Linqpad で視覚化されるように次のようになります。

enter image description here

6
Tedford