【问题标题】:Extract id from json string [duplicate]从json字符串中提取id [重复]
【发布时间】:2017-12-31 18:23:34
【问题描述】:

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

【问题讨论】:

标签: c#


【解决方案1】:

使用 Newtonsoft.Json:

JObejct.Parse(str)["value"].First()["id"].Value<string>()

Newtonsoft 几乎是在 c# 中处理 json 的方法。

请注意,数组中可以有多个项目。此代码取第一个。

【讨论】:

  • 我可能会先调用 FirstOrDefault() 然后测试它是否不为空。如果集合为空,First() 可能会导致应用程序失败。除此之外,这是一个很好的答案
【解决方案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 ); 

【讨论】:

    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2018-06-11
    • 2018-12-14
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    相关资源
    最近更新 更多