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

8 浏览
0 Comments

如何以编程方式从动态 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?谢谢。

0
0 Comments

如何通过动态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

0
0 Comments

问题的原因是用户想要从动态的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属性进行了类型转换来获取属性值。

0
0 Comments

问题的原因是作者在使用dynamic关键字时遇到了问题,想要从动态JObject中以编程的方式获取属性。代码中展示了如何使用dynamic关键字来反序列化JSON字符串,并根据已知返回类型或未知返回类型来获取属性。

解决方法:

1. 如果已知返回类型,可以使用泛型方法Deserialize来反序列化JSON字符串,并将返回结果赋值给一个具体类型的变量。例如,使用Deserialize来反序列化JSON字符串,并将结果赋值给jresponse变量。

2. 如果已知返回对象的类型,可以在该对象上使用Json属性来标记属性的名称。例如,在SearchedData类中,使用[JsonProperty(PropertyName = "Currency")]来标记Currency属性的名称。

3. 如果不知道返回类型,可以将dynamic作为泛型类型参数,以便在反序列化过程中使用。例如,使用Deserialize来反序列化JSON字符串,并将结果赋值给jresponse变量。

通过以上方法,作者可以根据不同的情况来获取动态JObject中的属性。

0