C#从反序列化的json对象中获取值

时间:2017-01-19 22:31:14

标签: c# json

我目前正在使用以下代码使用Newtonsoft.Json nuget数据包反序列化json字符串:

var data = (JObject)JsonConvert.DeserializeObject(json);

现在我收到了以下格式的对象:

{{  "meta": {    "rap": 2098,    "count": 5  },  "data": [    {      "name": "Gold Tetramino of Mastery",      "rap": 735,      "uaid": "16601901",      "link": "https://www.roblox.com/Gold-Tetramino-of-Mastery-item?id=5786047",      "img": "https://t4.rbxcdn.com/081337d7ea86e6a406512aaa83bbcdeb",      "serial": "---",      "count": 1    },    {      "name": "Silver Tetramino of Accomplishment",      "rap": 385,      "uaid": "16601900",      "link": "https://www.roblox.com/Silver-Tetramino-of-Accomplishment-item?id=5786026",      "img": "https://t1.rbxcdn.com/60da69cd76f8dad979326f63f4a5b657",      "serial": "---",      "count": 1    },    {      "name": "Subzero Ski Specs",      "rap": 370,      "uaid": "155175547",      "link": "https://www.roblox.com/Subzero-Ski-Specs-item?id=19644587",      "img": "https://t4.rbxcdn.com/8ead2b0418ef418c7650d34103d39b6d",      "serial": "---",      "count": 1    },    {      "name": "Rusty Tetramino of Competence",      "rap": 319,      "uaid": "16601899",      "link": "https://www.roblox.com/Rusty-Tetramino-of-Competence-item?id=5785985",      "img": "https://t2.rbxcdn.com/968ad11ee2f4ee0861ae511c419148c8",      "serial": "---",      "count": 1    },    {      "name": "Bluesteel Egg of Genius",      "rap": 289,      "uaid": "16601902",      "link": "https://www.roblox.com/Bluesteel-Egg-of-Genius-item?id=1533893",      "img": "https://t7.rbxcdn.com/48bf59fe531dd1ff155e455367e52e73",      "serial": "---",      "count": 1    }  ]}}

现在我试图从中获取以下值:

"rap": 2098,

我只需要2098 ,我一直在尝试以下代码:

string rap = data["rap"].Value<string>();

但遗憾的是,这不会起作用。有没有人知道如何获得价值?

10 个答案:

答案 0 :(得分:4)

尝试:

var result = data["meta"]["rap"].Value<int>();

var result = data.SelectToken("meta.rap").ToString();

或者如果您不想要传递整个路径,您可以像这样搜索属性:

var result = data.Descendants()
                 .OfType<JProperty>()
                 .FirstOrDefault(x => x.Name == "rap")
                 ?.Value;

答案 1 :(得分:3)

不是声明为类型var并让编译器对其进行排序,而是声明为动态并使用Parse方法。

dynamic data = JArray.Parse(json);

然后尝试

data.meta.rap

获取内部说唱对象。 我使用deserializeobject方法进行了编辑,因为我错误地认为它具有动态返回类型。有关详细信息,请参阅json.net文档:http://www.newtonsoft.com/json/help/html/QueryJsonDynamic.htm

答案 2 :(得分:1)

var jobject = (JObject)JsonConvert.DeserializeObject(json);
var jvalue = (JValue)jobject["meta"]["rap"];
Console.WriteLine(jvalue.Value); // 2098

答案 3 :(得分:0)

该值实际上是int类型。尝试:

int rap = data["rap"].Value<int>();

答案 4 :(得分:0)

string rap = JsonConvert.DeserializeObject<dynamic>(json).meta.rap;
Console.WriteLine(rap); // 2098

如果你没有进入dynamic(或者没有使用.NET 4+),我喜欢this other answer仅依赖于Json.NET的API。

答案 5 :(得分:0)

只需使用对象的动态表示:

dynamic obj = JsonConvert.DeserializeObject(json)
var value = obj.meta.rap;

JObject可轻松转换为动态类型本身。您可以从此值获取字符串或int:

var ivalue = (int)obj.meta.rap;
var svalue = (string)obj.meta.rap;

答案 6 :(得分:0)

尝试如下使用

var test = JsonConvert.DeserializeObject<dynamic>(param);

var testDTO = new TPRDTO();
testDTO.TPR_ID = test.TPR_ID.Value;

注意:要使用JsonConvert类,您必须从程序包管理器

中安装 Newton-Soft >

答案 7 :(得分:0)

问题是您要将反序列化的json转换为JObject。如果您想拥有JObject,则只需执行以下操作:

JObject.Parse(json); 

然后您拥有JObject,并且可以访问特定路径(有关提取值的信息,请参见this

您还有另一个选择是将json反序列化为代码中具有的类,如下所示:

var instanceOFTheClass =  JsonConvert.DeserializeObject<YourClassName>(json); 

使用上述代码,您可以访问所需的任何属性和值。

答案 8 :(得分:0)

使用枚举器获取值:

var data = (JObject)JsonConvert.DeserializeObject(json);
var enumerator = data.GetEnumerator();
enumerator.MoveNext();
var dataValue = enumerator.Current.Value.ToString();

答案 9 :(得分:0)

我只是来添加而获得2098的另一种方法


按照实际操作方式获得对象后

var data = (JObject)JsonConvert.DeserializeObject(json);

首先要注意的是,要获取的值本身就是属性"meta"的值:

Exact location of the desired value inside the Json object

因此,首先您必须通过简单地调用

来提取"meta"的内容
data["meta"]

然后您就可以要求Value<string>中的"rap"

String rap = data["meta"].Value<string>("rap");

准确地为您提供了您想要的价值:

Console.WriteLine(rap); // 2098