我目前正在使用以下代码使用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>();
但遗憾的是,这不会起作用。有没有人知道如何获得价值?
答案 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
类,您必须从程序包管理器
答案 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)