Вопрос по json, c# – Разбор страницы JSON

0

Пытался понять, как разобрать"in_reply_to_status_id_str -> id_str" сформировать страницу поиска в твиттере:

https://twitter.com/phoenix_search.phoenix?q=hello&headers%5BX-Twitter-Polling%5D=true&headers%5BX-PHX%5D=true&since_id=203194965877194752&include_entities=1&include_available_features=1& contributor_details = истина & амп; режим = уместность & амп; query_source = неизвестно

Кто-нибудь может написать небольшой пример, чтобы показать, как это можно сделать?

Не могли бы вы опубликовать пример? :) user1213488
Вам нужно будет получить динамический конвертер Json, а затем вам придется перебирать все объекты, разделяя их. Вы пробовали это? moutonc
Я не могу заставить это работать, пытался, но получал ошибки повсюду user1213488
/ Stackoverflow.com вопросы / 3142495 / ... Это отличный пример moutonc
Какие ошибки вы получили? Я просто использовал это на днях, чтобы сделать то же самое, но не из Twitter, а из TeamCity. moutonc

Ваш Ответ

5   ответов
1

С помощью Json.Net

dynamic jObj = JsonConvert.DeserializeObject(new WebClient().DownloadString("your url"));
foreach (var item in jObj.statuses)
{
    Console.WriteLine("{0} {1}", item.in_reply_to_status_id_str, item.id_str);
}
Как я могу распечатать это в окне сообщения, а не в консоли? user1213488
MessageBox.Show(item.in_reply_to_status_id_str.ToString() + " " + item.id_str.ToString());. Возможно, вам придется проверить, является лиitem.xxx ноль перед вызовомToString() L.B
1

где я вытащил мой Json, вот где мой список составлен, который вы все готовы иметь:

public JsonResult AllStatuses() //from the json called in the _client view
    {
        var buildStatuses = new List<BuildStatus>();
        var projects = Client.AllProjects();           

        foreach (var project in projects)
        {                
            try 
            {
                var buildConfigs = Client.BuildConfigsByProjectId(project.Id);

                foreach (var buildConfig in buildConfigs)
                {
                    var b = new BuildStatus();
                    var build = Client.LastBuildByBuildConfigId(buildConfig.Id);
                    var status = build.Status; // Used to loop through BuildConfigID's to find which is a FAILURE, SUCCESS, ERROR, or UNKNOWN

                    var change = Client.LastChangeDetailByBuildConfigId(buildConfig.Id); // Provides the changeID
                    var changeDetail = Client.ChangeDetailsByChangeId(change.Id); // Provides the username, this one populates the usernames

                    if (changeDetail != null)
                        b.user = changeDetail.Username;

                    b.id = buildConfig.Id.ToString();

                    // If the date isn't null place the start date in long format
                    if (build.StartDate != null)
                        b.date = build.StartDate.ToString();

                    // If block; set the status based on the BuildconfigID from the var status
                    if (status.Contains("FAILURE")){
                        b.status = "FAILURE";
                    }
                    else if (status.Contains("SUCCESS")){
                        b.status = "SUCCESS";
                    }
                    else if (status.Contains("ERROR")){
                        b.status = "ERROR";
                    }
                    else{
                        b.status = "UNKNOWN";
                    }
                    buildStatuses.Add(b);
                }

            } catch { }

        }
        var query = buildStatuses.OrderBy(x => x.status); // Create a sorted list from Error - Unknown               

        return Json(query, JsonRequestBehavior.AllowGet);

Затем я скопировал JsonConverter, который тоже связал тебя.

На моем сайте я наконец-то разобрал список Json.

 public JsonResult AllStatuses() //from the json called in the _client view
    {
        List<Client> clients = storeDB.Clients.Include("Projects").Include("Projects.Builds").ToList();
        var buildStatuses = new List<BuildStatus>();

        foreach (var client in clients) {
            // Network credentials
            // Used to get the Json Service request                         // URL here: client.ClientURL
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:81/Status/AllStatuses");
            var response = request.GetResponse();
            var reader = new StreamReader(response.GetResponseStream());
            var responseString = reader.ReadToEnd();

            var serializer = new JavaScriptSerializer();
            serializer.RegisterConverters((new[] { new DynamicJsonConverter() }));
            dynamic obj = serializer.Deserialize(responseString, typeof(object)) as dynamic;

            foreach (var objects in obj) // Pull apart the dynamic object
            {
                var id = objects.id;
                var status = objects.status;
                var date = objects.date;
                var user = objects.user;

                var bs = new BuildStatus();
                try
                {
                    bs.status = status;
                    bs.date = date;
                    bs.id = id;
                    bs.user = user;
                }
                catch { throw; }
                buildStatuses.Add(bs);
            }
        }              

        return Json(buildStatuses, JsonRequestBehavior.AllowGet);
    }
0

Иди за подходом jQuery:

var obj = jQuery.parseJSON(jsonString);
alert(obj.in_reply_to_status_id_str.id_str);
0

эт Json библиотека для этого.

0

доступный в .NET, после добавления ссылки на System.Runtime.Serialization.

Все, что вам нужно сделать, это создать два класса DataContract. Что-то типа

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;

namespace MyNamespace
{
   [DataContract]
   public class TwitterObject
   {
      [DataMember(Name = "statuses")]
      public TwitterStatus[] Statuses { get; set; }
   }

   [DataContract]
   public class TwitterStatus
   {
       [DataMember(Name = "in_reply_to_status_id_str")]
       public string InReplyToStatusIdStr { get; set; }

       [DataMember(Name = "id_str")]
       public string IdStr { get; set; }
   }
}

Затем из любого другого метода, который вам нужен, вам просто нужно использовать DataContractJsonSerializer для встраивания вашего JSON в объект .NET:

DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(TwitterObject));

// assume the twitterResponse is the JSON you receive
MemoryStream memoryStream = new MemoryStream(Encoding.ASCII.GetBytes(twitterResponse));

var twitterJson = jsonSerializer.ReadObject(memoryStream) as TwitterObject;

Там могут быть некоторые опечатки, но это должно дать вам подсказку. В настоящее время я работаю над обширной синхронизацией между серверным приложением и веб-сайтом, и этот метод я сейчас использую для связи JSON между ними. Я обнаружил, что сочетание DataContracts и DataContractJsonSerializer проще в использовании, чем сторонние библиотеки.

Похожие вопросы