如何以编程方式从动态对象获取属性
本文关键字:动态 对象 获取 属性 方式 编程 | 更新日期: 2023-09-27 18:10:02
我正在使用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 ?
谢谢。
假设您正在使用Newtonsoft.Json.Linq。对象,您不需要使用动态。JObject类可以接受字符串索引器,就像字典一样:
JObject myResult = GetMyResult();
returnObject.Id = myResult["string here"]["id"];
希望这对你有帮助!
另一种方法是通过使用SelectToken
(假设您正在使用Newtonsoft.Json
):
JObject json = GetResponse();
var name = json.SelectToken("items[0].name");
完整文档:https://www.newtonsoft.com/json/help/html/SelectToken.htm
使用如下动态关键字:
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);