web-dev-qa-db-ja.com

プログラムで動的JObjectからプロパティを取得する方法

NewtonSoft JObjectを使用してJSON文字列を解析しています。プログラムで動的オブジェクトから値を取得するにはどうすればよいですか?すべてのオブジェクトに対して自分自身を繰り返さないようにコードを簡略化したいと思います。

public ExampleObject GetExampleObject(string jsonString)
{
ExampleObject returnObject = new ExampleObject();
dynamic dynamicResult = JObject.Parse(jsonString);
if (!ReferenceEquals(dynamicResult.album, null))
   {
       //code block to extract to another method if possible
       returnObject.Id = dynamicResult.album.id; 
       returnObject.Name = dynamicResult.album.name;
       returnObject.Description = dynamicResult.albumsdescription;
       //etc..
   }
else if(!ReferenceEquals(dynamicResult.photo, null))
   {
       //duplicated here
       returnObject.Id = dynamicResult.photo.id;
       returnObject.Name = dynamicResult.photo.name;
       returnObject.Description = dynamicResult.photo.description;
       //etc..
   }
else if..
//etc..

return returnObject;
}

「if」ステートメントのコードブロックを別のメソッドに抽出する方法はありますか。

private void ExampleObject GetExampleObject([string of desired type goes here? album/photo/etc])
{
  ExampleObject returnObject = new ExampleObject();
  returnObject.Id = dynamicResult.[something goes here?].id;
  returnObject.Name = dynamicResult.[something goes here?].name;
  //etc..
  return returnObject;
}

動的オブジェクトにリフレクションを使用できないため、それは可能ですか?または、JObjectを正しく使用していますか?

ありがとう。

20
dcdroid

Newtonsoft.Json.Linq.JObjectを使用していると仮定すると、動的を使用する必要はありません。 JObjectクラスは、辞書のように文字列インデクサーを使用できます。

JObject myResult = GetMyResult();
returnObject.Id = myResult["string here"]["id"];

お役に立てれば!

27

以下のような動的キーワードを使用:

private static JsonSerializerSettings jsonSettings;

private static T Deserialize<T>(string jsonData)
{
   return JsonConvert.DeserializeObject<T>(jsonData, jsonSettings);
}

//何が返されるかわかっている場合

var jresponse = Deserialize<SearchedData>(testJsonString);

//戻りオブジェクトタイプがわかっている場合は、次のようなjson属性で署名する必要があります

[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class SearchedData
{
    [JsonProperty(PropertyName = "Currency")]
    public string Currency { get; set; }
    [JsonProperty(PropertyName = "Routes")]
    public List<List<Route>> Routes { get; set; }
}

//戻り値の型がわからない場合は、ジェネリック型としてダイナミックを使用します

var jresponse = Deserialize<dynamic>(testJsonString);
0
Hamit YILDIRIM

これをターゲットにするもう1つの方法は、SelectTokenを使用することです(Newtonsoft.Json):

JObject json = GetResponse();
var name = json.SelectToken("items[0].name");

完全なドキュメント: https://www.newtonsoft.com/json/help/html/SelectToken.htm

0
Ziad Akiki