Newtonsoft.Синтаксический анализ json с веб-страницы не работает

#c# #json #json.net

#c# #json #json.net

Вопрос:

Я создал простую программу, которая получает json с веб-сайта. Он должен выдавать некоторые атрибуты json, но он этого не делает. Это просто дает мне четкую строку без текста в ней. Кто-нибудь может мне помочь?

Мой код:

 using System;
using System.Linq;
using System.Diagnostics;
using System.Threading;
using System.Net;
using System.IO;
using Newtonsoft.Json;
namespace ESEL_Scraper_2._0
{
    
    class MyJsonType
    {
        public string title { get; set; }

        public int id { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            WebClient client = new WebClient();
            client.Encoding = System.Text.Encoding.UTF8;
            string site = client.DownloadString($"https://esel.at/api/termine/data?date=05.09.2020amp;selection=false");
            var myJsonObject = JsonConvert.DeserializeObject<MyJsonType>(site);
            Console.WriteLine(myJsonObject.title);
        }
    }
}
  

JSON:https://esel.at/api/termine/data?date=05.09.2020amp;selection=false

Комментарии:

1. Добавьте class Root { public MyJsonType[] termine { get; set; } } класс. Десериализуйте его.

Ответ №1:

MyJsonType ожидает, что тело будет похоже,

 {
   "id": 1,
   "title": "title"
}
  

но в вашем случае json является,

 {
   "termine": [
    { -> object }
    { -> object }
   ]
}
  

У вас есть массив объектов, которые вписываются в ваш MyJsonType . Используйте следующий класс для десериализации в

 public class RootObject 
{
   [JsonProperty("termine")] // the name of the property is case sensetive.
   public List<MyJsonType> Termine {get;set;}
}

public class MyJsonType
{
    [JsonProperty("title")]
    public string Title { get; set; } //C# uses uppercase first letter for properties.
    [JsonProperty("id")]
    public int Id { get; set; }
}

// in your main,
var obj = JsonConvert.DeserializeObject<RootObject>(json);
Console.WriteLine(obj.Termine.First().Title);
  

Ответ №2:

Вам нужно структурировать свой вызов в соответствии с вашей строкой json.

Ваш класс должен выглядеть следующим образом

 public class ParentJsonType
        {
            public List<MyJsonType> termine { get; set; }
        }
        public class MyJsonType
        {
            public string title { get; set; }

            public int id { get; set; }
        }
  

и в вашем коде вы можете десериализовать

 WebClient client = new WebClient();
            client.Encoding = System.Text.Encoding.UTF8;
            string site = client.DownloadString($"https://esel.at/api/termine/data?date=05.09.2020amp;selection=false");
            var myJsonObject = JsonConvert.DeserializeObject<List<MyJsonType>>(site);
            foreach(var myJosnType in myJsonObject)
            {
                //add your logic here
                Console.WriteLine(myJosnType.title);
            }
  

Ответ №3:

Да, ребята, которые уже ответили, абсолютно правы. Дело в неправильной модели, которая у вас есть, которая не имеет необходимой структуры для содержания ответного контекста.

Следующий подход также работает. Правильная модель для этого JSON должна быть:

 public class Termine
{
    public Int64 id {get;set;}//":106102,
    public String title {get;set;}//":"curated by 2020",
    public String category {get;set;}//":"eSeLs Neugierde",
    public String startdate {get;set;}//":"Sa, 05.09.2020",
    public String startdatetime {get;set;}//":"Sa, 05.09. 11:00",
    public String starttime {get;set;}//":"11:00",
    public String enddate {get;set;}//":"Sa, 05.09.2020",
    public List<object> runtime {get;set;}//":[            0,            "nur noch heute"         ],
    public String thumbnail {get;set;}//":"https://static.esel.at/mini//upload/IpeP5wgYL7sRucTuFtpJg53zgG7hby5IiXv5txLk.jpeg",
    public String  thumbnail_credits {get;set;}//":null,
    public String type {get;set;}//":"upcoming",
    public String recommended {get;set;}//":"(Wie) Schafft's Kunst als Aktivismus in Galerieru00e4ume?`",
    public Boolean online_event {get;set;}//":false,
    public String feed_urls {get;set;}//":null,
    public String status {get;set;}//":"",
    public String tags {get;set;}//":"Galerienfestival, internationale KuratorInnen, Aktivismus, Kunst, curatedby",
    public String url {get;set;}//":"https://esel.at/termin/106102/curated-by-2020",
    public DateTime sort_date {get;set;}//":"2020-09-05 11:00:00",
    public String sort_category {get;set;}//":"eselsneugierde",
    public String location_url {get;set;}//":"https://esel.at/location/933/wien",
    public String location {get;set;}//":"Wien"
    public override String ToString(){
        return String.Format("[{0}] {1} ({2})", this.id, this.title, this.location_url);
    }
}
public class Meta
{
    public List<String> next {get;set;}//":[         "Sonntag,<br><nobr>06. September 2020</nobr>",         "06.09.2020",         "06092020"      ],
    public DateTime now {get;set;}//":"2020-09-05T18:52:05.000040Z",
    public List<String> da {get;set;}//":[         "Samstag,<br><nobr>05. September 2020</nobr>",         "05.09.2020",         "05092020"      ],
    public DateTime end {get;set;}//":"2020-09-05T21:59:59.999999Z",
    public DateTime runtime {get;set;}//":"2020-09-04T22:00:00.000000Z",
    public Int32 upcoming {get;set;}//":14
    public Int32 running {get;set;}//":87,
    public Int64 termine {get;set;}//":16
}
public class Context
{
    public List<Termine> termine{get;set;}
    public Meta meta {get;set;}
}
  

Итак, ваш код будет работать с несколькими изменениями:

 public static void Main(string[] args)
    {
        WebClient client = new WebClient()
        {
            Encoding = System.Text.Encoding.UTF8
        };
        string site = client.DownloadString("https://esel.at/api/termine/data?date=05.09.2020amp;selection=false");
        Context ctx = JsonConvert.DeserializeObject<Context>(site);
        ctx.termine.ForEach(Console.WriteLine);
    }
  

Вот ссылка на полное решение, где вы можете запустить и протестировать.
https://dotnetfiddle.net/elq5Lv