在C#中解析Json rest api响应

35

我正在尝试使用C#从rest api的json响应中提取一个值。

我有以下代码:

client.BaseUrl = "https://api.cloud.appcelerator.com";
request.Resource = "/v1/chats/create.json?key=" + cac.AppCode.ToString();
request.Method = Method.POST;
request.AddUrlSegment("appkey", "key");
var response = client.Execute(request);

在“响应”消息中,我收到了以下 JSON 内容:

{
  "meta": {
    "code": 200,
    "status": "ok",
    "method_name": "createChatMessage"
  },
  "response": {
    "chats": [
      {
        "id": "521cfcd840926a0b3500449e",
        "created_at": "2013-08-27T19:24:08+0000",
        "updated_at": "2013-08-27T19:24:08+0000",
        "message": " join to the chat group, welcome …",
        "from": {
          "id": "520f41e125e74b0b2400130a",
          "first_name": "Administrator",
          "created_at": "2013-08-17T09:26:57+0000",
          "updated_at": "2013-08-27T19:23:10+0000",
          "external_accounts": [

          ],
          "email": "roy@tomax.co.il",
          "confirmed_at": "2013-08-17T09:26:57+0000",
          "username": "admin",
          "admin": "true",
          "stats": {
            "photos": {
              "total_count": 0
            },
            "storage": {
              "used": 0
            }
          }
        },
        "chat_group": {
          "id": "521cfcd840926a0b3500449d",
          "created_at": "2013-08-27T19:24:08+0000",
          "updated_at": "2013-08-27T19:24:08+0000",
          "message": " join to the chat group, welcome …",
          "participate_users": [
            {
              "id": "520f41e125e74b0b2400130a",
              "first_name": "Administrator",
              "created_at": "2013-08-17T09:26:57+0000",
              "updated_at": "2013-08-27T19:23:10+0000",
              "external_accounts": [

              ],
              "email": "roy@tomax.co.il",
              "confirmed_at": "2013-08-17T09:26:57+0000",
              "username": "admin",
              "admin": "true",
              "stats": {
                "photos": {
                  "total_count": 0
                },
                "storage": {
                  "used": 0
                }
              }
            }
          ]
        }
      }
    ]
  }
}

我该如何从返回的JSON响应结果中提取嵌套的值"id": "521cfcd840926a0b3500449e"?

我正在使用C#。


请使用解析器(您目前没有展示任何证据)来解析JSON。可能还有其他相关的线程。您尝试过搜索吗?如果是,为什么结果不起作用? - Arran
3个回答

57

1> 添加这个命名空间。 using Newtonsoft.Json.Linq;

2> 使用此源代码。

JObject joResponse = JObject.Parse(response);                   
JObject ojObject = (JObject)joResponse["response"];
JArray array= (JArray)ojObject ["chats"];
int id = Convert.ToInt32(array[0].toString());

1
2天了...我一直在寻找一个可行的答案,现在终于找到了。谢谢。 - DDuffy
终于了!!这是唯一真正有效的答案! - Paulo Guimarães
我的JSON与此类似,所以我不得不稍微修改一下这段代码,但是它确实帮了我很大的忙。非常感谢! - Jaideep Dhumal

34
  1. 创建与您的数据匹配的类,
  2. 然后使用JSON.NET将JSON数据转换为常规的C#对象。

步骤1:一个伟大的工具 - http://json2csharp.com/ - 生成的结果如下所示

步骤2:JToken.Parse(...).ToObject<RootObject>()

public class Meta
{
    public int code { get; set; }
    public string status { get; set; }
    public string method_name { get; set; }
}

public class Photos
{
    public int total_count { get; set; }
}

public class Storage
{
    public int used { get; set; }
}

public class Stats
{
    public Photos photos { get; set; }
    public Storage storage { get; set; }
}

public class From
{
    public string id { get; set; }
    public string first_name { get; set; }
    public string created_at { get; set; }
    public string updated_at { get; set; }
    public List<object> external_accounts { get; set; }
    public string email { get; set; }
    public string confirmed_at { get; set; }
    public string username { get; set; }
    public string admin { get; set; }
    public Stats stats { get; set; }
}

public class ParticipateUser
{
    public string id { get; set; }
    public string first_name { get; set; }
    public string created_at { get; set; }
    public string updated_at { get; set; }
    public List<object> external_accounts { get; set; }
    public string email { get; set; }
    public string confirmed_at { get; set; }
    public string username { get; set; }
    public string admin { get; set; }
    public Stats stats { get; set; }
}

public class ChatGroup
{
    public string id { get; set; }
    public string created_at { get; set; }
    public string updated_at { get; set; }
    public string message { get; set; }
    public List<ParticipateUser> participate_users { get; set; }
}

public class Chat
{
    public string id { get; set; }
    public string created_at { get; set; }
    public string updated_at { get; set; }
    public string message { get; set; }
    public From from { get; set; }
    public ChatGroup chat_group { get; set; }
}

public class Response
{
    public List<Chat> chats { get; set; }
}

public class RootObject
{
    public Meta meta { get; set; }
    public Response response { get; set; }
}

5
兄弟,json2csharp网站真是太棒了!感谢分享! - Hajjat
1
我正在做同样的事情,但似乎它违反了 C# 编码规范,比如 属性没有以大写字母开头。 你有什么更好的建议来改进这个示例吗? - Jamshaid K.

1
创建一个C#类,映射到您的Json,并使用Newsoft JsonConvert进行反序列化。
例如:
public Class MyResponse
{
    public Meta Meta { get; set; }
    public Response Response { get; set; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接