web-dev-qa-db-fra.com

Comment obtenir une propriété de JObject dynamique par programme

J'analyse une chaîne JSON à l'aide de NewtonSoft JObject. Comment obtenir les valeurs d'un objet dynamique par programmation? Je souhaite simplifier le code pour ne pas me répéter pour chaque objet.

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;
}

Est-il possible d'extraire les blocs de code dans les instructions "if" d'une méthode séparée, par exemple:

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;
}

Est-ce même possible puisque nous ne pouvons pas utiliser la réflexion pour des objets dynamiques. Ou est-ce que j'utilise même le JObject correctement?

Merci.

14
dcdroid

En supposant que vous utilisiez Newtonsoft.Json.Linq.JObject, vous n'avez pas besoin d'utiliser dynamique. La classe JObject peut prendre un indexeur de chaîne, exactement comme un dictionnaire:

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

J'espère que cela t'aides!

27
Connie Hilarides

avec mot clé dynamique comme ci-dessous:

private static JsonSerializerSettings jsonSettings;

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

// si tu sais ce qui va revenir

var jresponse = Deserialize<SearchedData>(testJsonString);

// si vous connaissez le type d'objet renvoyé, vous devez le signer avec les attributs json tels que 

[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; }
}

// si vous ne connaissez pas le type de retour, utilisez dynamic comme type générique

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

Une autre méthode de ciblage consiste à utiliser SelectToken (en supposant que vous utilisez Newtonsoft.Json):

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

Pour une documentation complète: https://www.newtonsoft.com/json/help/html/SelectToken.htm

0
Ziad Akiki