我有以下json字符串。使用c#从中提取id的最佳方法是什么?
{
"count":1,
"value": [ {
"id":35,
"projectId": "frfsdf-039a-405b-8835-5ddb00cfsdf9f107",
"name":"Default",
"pool":{
"id":1,
"scope":"8850710d-4558-4f08-8064-38000a03d209",
"name":"Default",
"isHosted":false,
"poolType":"automation"
}
}]
}
答案 0 :(得分:2)
开发者时间 - 最便宜的方式是使用C#dynamic
using Newtonsoft.Json;
Int32 GetId()
{
String jsonStr = "{ \"count\":...";
dynamic jsonBlob = JObject.Parse( jsonStr );
return jsonBlob.value[0].id;
}
注意我个人反对使用dynamic
,因为你失去了编译时类型安全性,而dynamic
对于一次性操作来说有些昂贵 - 所以你可能想用Json处理它.NET自己的令牌对象:
JObject root = JObject.Parse( jsonStr );
JToken idToken = root.Properties["value"].GetChildren().First().Properties["id"];
return idToken.ToObject<Int32>();
最后,你总是可以定义自己的类并反序列化:
class Foo {
public Int32 Count { get; set; }
public FooValue[] Value { get; set; }
}
class FooValue {
public Int32 Id { get; set; }
public Guid ProjectId { get; set; }
public String Name { get; set; }
}
Foo foo = JsonConvert.Deserialize<Foo>( jsonStr );
return foo.Value[0].Id;
如果JSON格式始终保持一致,并且您不会处理任何其他JSON,那么您可以通过使用正则表达式甚至是简单的字符串处理来避免对Newtonsoft.Json(Json.NET)的依赖:
Int32 idIdx = jsonStr.IndexOf("\"id\":");
if( idIdx == -1 ) return null;
Int32 commaIdx = jsonStr.IndexOf(",", idIdx);
if( commaIdx == -1 ) return null;
return jsonStr.Substring( idIdx, commaIdx - idIdx );
答案 1 :(得分:2)
使用Newtonsoft.Json:
JObejct.Parse(str)["value"].First()["id"].Value<string>()
Newtonsoft几乎是在c#中处理json的方法。
请注意,您可以在数组中包含多个项目。这段代码是第一个。