如何以编程方式从动态JObject获取属性

时间:2013-04-19 05:26:29

标签: c# .net json json.net deserialization

我正在使用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?

感谢。

3 个答案:

答案 0 :(得分:28)

假设您使用的是Newtonsoft.Json.Linq.JObject,则无需使用动态。 JObject类可以使用字符串索引器,就像字典一样:

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

希望这有帮助!

答案 1 :(得分:0)

使用动态关键字,如下所示:

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

//如果你不知道返回类型使用dynamic作为泛型类型

var jresponse = Deserialize<dynamic>(testJsonString);

答案 2 :(得分:0)

针对此问题的另一种方法是使用SelectToken(假设您使用的是Newtonsoft.Json

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

有关完整文档:https://www.newtonsoft.com/json/help/html/SelectToken.htm