如何以编程方式从动态 JObject 中获取属性
如何以编程方式从动态 JObject 中获取属性
我正在使用NewtonSoft JObject解析一个JSON字符串。如何以编程的方式从动态对象中获取值?我想简化代码,避免为每个对象重复自己的代码。
public ExampleObject GetExampleObject(string jsonString) { ExampleObject returnObject = new ExampleObject(); dynamic dynamicResult = JObject.Parse(jsonString); if (!ReferenceEquals(dynamicResult.album, null)) { ExtractValuesFromObject(dynamicResult.album, returnObject); } else if(!ReferenceEquals(dynamicResult.photo, null)) { ExtractValuesFromObject(dynamicResult.photo, returnObject); } // etc.. return returnObject; } private void ExtractValuesFromObject(dynamic obj, ExampleObject returnObject) { returnObject.Id = obj.id; returnObject.Name = obj.name; returnObject.Description = obj.description; // etc.. }
我可以将"if"语句中的代码块提取到一个单独的方法中吗?例如:
private void ExampleObject GetExampleObject([写入所需类型的字符串 album/photo/etc]) { ExampleObject returnObject = new ExampleObject(); returnObject.Id = dynamicResult.[在这里写入某些内容].id; returnObject.Name = dynamicResult.[在这里写入某些内容].name; // etc.. return returnObject; }
由于我们无法对动态对象使用反射,这种方式是否可行?或者我是否正确地使用了JObject?谢谢。
如何通过动态JObject编程从属性中获取属性
有时候,我们使用Newtonsoft.Json时,我们需要从动态JObject中获取属性。这是一个例子,展示了如何通过SelectToken方法实现这一目标:
JObject json = GetResponse(); var name = json.SelectToken("items[0].name");
以上代码通过使用SelectToken方法,从动态JObject中获取了属性"items[0].name"的值。在这个例子中,我们假设GetResponse方法返回了一个JObject对象。
如果你想要了解更多关于SelectToken方法的详细信息,你可以参考官方文档:https://www.newtonsoft.com/json/help/html/SelectToken.htm
问题的原因是用户想要从动态的JObject对象中获取属性,但是对于JObject对象来说,并不需要使用dynamic关键字。JObject类可以像字典一样使用字符串索引器来获取属性值。解决方法是直接使用JObject对象的字符串索引器来获取属性值。
代码示例:
JObject myResult = GetMyResult(); returnObject.Id = myResult["string here"]["id"];
在`["string here"]`中填入需要获取的属性名。如果填入"id",将会返回该对象中ID属性的值。这个过程是区分大小写的,所以结果取决于序列化对象时使用的JsonSerializer设置。
另外,有用户尝试使用GetProperty方法,但是这个方法不适用于JObject对象。正确的方法是直接使用JObject对象的字符串索引器。
代码示例:
String MyProperty1Value = (String)((Newtonsoft.Json.Linq.JObject)This.Tag)["MyProperty1"];
以上代码只是一个示例,不是实际代码。用户使用了lambda函数,并对Tag属性进行了类型转换来获取属性值。
问题的原因是作者在使用dynamic关键字时遇到了问题,想要从动态JObject中以编程的方式获取属性。代码中展示了如何使用dynamic关键字来反序列化JSON字符串,并根据已知返回类型或未知返回类型来获取属性。
解决方法:
1. 如果已知返回类型,可以使用泛型方法Deserialize
2. 如果已知返回对象的类型,可以在该对象上使用Json属性来标记属性的名称。例如,在SearchedData类中,使用[JsonProperty(PropertyName = "Currency")]来标记Currency属性的名称。
3. 如果不知道返回类型,可以将dynamic作为泛型类型参数,以便在反序列化过程中使用。例如,使用Deserialize
通过以上方法,作者可以根据不同的情况来获取动态JObject中的属性。