从json字符串中提取id

时间:2017-12-31 18:23:35

标签: c#

我有以下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"
        }
    }]
}

2 个答案:

答案 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的方法。

请注意,您可以在数组中包含多个项目。这段代码是第一个。