如何使用JSON反序列化捕获特定值?

时间:2013-01-28 09:27:29

标签: c# .net json deserialization

我用.NET捕获了一个JSON:

string result = json_serializer.Deserialize(myJSON);

JSON的结构如下:

result
    data[0]
        user
            bio
            name
            nickname
    data[1]
        user
            bio
            name
            nickname    
    data[2]
        user
            bio
            name
            nickname    

我想得到第一个有一些价值的昵称(作为字符串):我的意思是,它不是空的而且不是空的。

我该怎么做?

3 个答案:

答案 0 :(得分:2)

根据我对你的问题的理解,你会想要这样的东西,

public string FirstUserNickname(string JsonUserInfo) 
{
    JavaScriptSerializer JsonSerializer = new JavaScriptSerializer();
    ResultData Results = JsonSerializer.Deserialize<ResultData>(JsonUserInfo);
    foreach (UserInfo UserInfo in Results.result)
    {
        if (string.IsNullOrEmpty(UserInfo.nickname))
            return UserInfo.nickname;
    }
    return null;
}

public class ResultData
{
    public List<UserInfo> result;
}

public class UserInfo
{
    public string bio;
    public string name;
    public string nickname;
}

这将实现您的目标,并且是一种强类型方法,使用JavaScriptSerializer程序集中的System.Web.Extensions类,可以找到更多信息here

答案 1 :(得分:1)

您可以使用Linq to JSON(搜索NuGet for Newtonsoft Json)。假设你的JSON看起来像:

{ "result": [ { "bio": "foo", "name": "Robin", "nickname": "Moll" },
              { "bio": "bar", "name": "Ted", "nickname": "DoctorZ" },
              { "bio": "moo", "name": "Barney", "nickname": "Wait4it" } ]
}

然后获取第一个用户的名字:

JObject jo = JObject.Parse(json);
var name = (string)jo["result"][0]["name"]; // Robin

当然,如果您可能没有任何用户,那么您应该验证该用户是否存在:

JObject jo = JObject.Parse(json);
var user = jo["result"].FirstOrDefault();
if (user != null)
    name = (string)user["name"];

答案 2 :(得分:1)

使用Linq to JSON可以反序列化为.net对象,如下所示:

Result deserializedResult = JsonConvert.DeserializeObject<Result>(json);

之后,您可以使用LINQ查询对象:

User nicknameduser = deserializedResult.Users
  .FirstOrDefault(r => !string.IsNullOrEmpty(r.nickname))
if (nicknameduser == null) return null;
return nicknameduser.nickname;