1

最近、動的データ型のJSON.NetAPIを使用してJSONコンテンツを逆シリアル化しようとしていました。

フォーラムを一生懸命検索したところ、WinRTでそれが実際に可能であることがわかりました。

サンプルJSONは次のようになります。

string json = "{\"message\":\"Sample Message\"}"

次の形式を使用しました。

dynamic result = JsonConvert.DeserializeObject<dynamic>(json);

結果としてコンテンツを正常に逆シリアル化します。しかし、次のような構文を使用してアクセスしようとすると、次のようになります。

string message = result.message;

次のようなエラーが発生します。

'object'には'message'の定義が含まれておらず、タイプ'object'の最初の引数を受け入れる拡張メソッド'message'が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)

インターネット全体で多くのjsonサンプルを試しましたが、エラーは同じままです。正直言って、私はそれを数時間前に試しましたが、実際に機能しました!でも今回は足りないものが見つかりませんでした。

PS:実際のJsonに動的フィールド名が含まれているため、動的を使用する必要があります。それが次のようになったら:

{"New York" : "Its in United States"}

そして時々それは次のようになります:

{"London" : "Its in United Kingdom"}

(ただし、クラップの例です!:P)json2csharpクラスのメソッドは、ここでは機能しません。二次的でより効率的なメソッドがあるかどうかを推測します。私を案内してください。私が解析しようとしている実際のJsonは非常に複雑です。投稿が必要な場合は投稿します。

4

2 に答える 2

3

私の個人的なプロジェクトではJSON.NETを使用していますが、次のような角かっこ構文を使用して逆シリアル化します。

Id = jsonResult["object_id"].ToObject<int>(),

実際にJSONオブジェクトを取得するには、次のようにします。

var response = await client.GetStringAsync(parameters);
var jsonResult = JToken.Parse(response)["results"].Children();

JSON.NETのさまざまな使用方法について十分な調査を行った後、この方法を採用しました。この記事を読んだ後、私はダイナミックルートに行くことを真剣に検討しました:http ://www.west-wind.com/weblog/posts/2012/Aug/30/Using-JSONNET-for-dynamic-JSON-parsing

ただし、最終的には動的オブジェクトに反対することにしました。通常のオブジェクトを角かっこ構文で埋めると、すぐに強い型の環境に戻り、インテリセンスがエラーをキャッチし始めるからです。これをLINQクエリと組み合わせて、かなり複雑なオブジェクトのセットを比較的少数の行に入力します。

私にとって、動的オブジェクトは、逆シリアル化プロセスのもう1つの弱い型のステップであり、可能であれば避けたいと思います。

于 2012-11-24T14:20:20.160 に答える
1

あなたが何をしようとしているのかよくわかりませんが、おそらくこれが役立つでしょう:

[TestCase("{\"message\":\"Sample Message\"}", "Sample Message")]
[TestCase("{\"New York\" : \"Its in United States\"}", "Its in United States")]
[TestCase("{\"London\" : \"Its in United Kingdom\"}", "Its in United Kingdom")]
public void TestNameTest(string json, string expected)
{
    var result = JObject.Parse(json);
    var value = result.Values().Single();
    var jValue = new JValue(expected);
    Assert.AreEqual( jValue,value);
}
于 2012-11-24T14:18:50.030 に答える