Nano Hash - криптовалюты, майнинг, программирование

Как преобразовать строку json без имени с помощью Newtonsoft?

Строка Json

{"geonames":[{"continent":"EU","capital":"Andorra la Vella","languages":"ca","geonameId":3041565,"south":42.42849259876837,"isoAlpha3":"AND","north":42.65604389629997,"fipsCode":"AN","population":"84000","east":1.7865427778319827,"isoNumeric":"020","areaInSqKm":"468.0","countryCode":"AD","west":1.4071867141112762,"countryName":"Andorra","continentName":"Europe","currencyCode":"EUR"},{"continent":"AS","capital":"Abu Dhabi","languages":"ar-AE,fa,en,hi,ur","geonameId":290557,"south":22.633329391479492,"isoAlpha3":"ARE","north":26.08415985107422,"fipsCode":"AE","population":"4975593","east":56.38166046142578,"isoNumeric":"784","areaInSqKm":"82880.0","countryCode":"AE","west":51.58332824707031,"countryName":"United Arab Emirates","continentName":"Asia","currencyCode":"AED"},{"continent":"AS","capital":"Kabul","languages":"fa-AF,ps,uz-AF,tk","geonameId":1149361,"south":29.377472,"isoAlpha3":"AFG","north":38.483418,"fipsCode":"AF","population":"29121286","east":74.879448,"isoNumeric":"004","areaInSqKm":"647500.0","countryCode":"AF","west":60.478443,"countryName":"Afghanistan","continentName":"Asia","currencyCode":"AFN"},{"continent":"AF","capital":"Harare","languages":"en-ZW,sn,nr,nd","geonameId":878675,"south":-22.417738,"isoAlpha3":"ZWE","north":-15.608835,"fipsCode":"ZI","population":"13061000","east":33.056305,"isoNumeric":"716","areaInSqKm":"390580.0","countryCode":"ZW","west":25.237028,"countryName":"Zimbabwe","continentName":"Africa","currencyCode":"ZWL"}]}

Как я могу заставить Newtonsoft анализировать данные?

Исключение Newtonsoft.Json.JsonSerializationException: 'Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип' App.Geonames ', потому что для этого типа требуется объект JSON (например, {"name": "value"}) правильно десериализовать. Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {"name": "value"}), либо измените десериализованный тип на массив или тип, реализующий интерфейс коллекции (например, ICollection, IList), например List, который может быть десериализованным из массива JSON. JsonArrayAttribute также можно добавить к типу, чтобы заставить его десериализоваться из массива JSON.

ОБНОВЛЕНО

Решение

Контроллер

string GeoNamesCountry = "http://api.geonames.org/countryInfo?username=justlearntutors&type=json";

string GeoNamesCountryResult = "";
using (WebClient webclient = new WebClient())
{
    GeoNamesCountryResult = webclient.DownloadString(GeoNamesCountry);
}

GeonamesObject geonamesObject = Newtonsoft.Json.JsonConvert.DeserializeObject<GeonamesObject>(GeoNamesCountryResult);

Модель

public class GeonamesObject
{
    public GeonamesCountry[] geonames { get; set; }
}

public class GeonamesCountry
{
    public string countryCode { get; set; }
    public string countryName { get; set; }
    public string isoNumeric { get; set; }
    public string isoAlpha3 { get; set; }
    public string fipsCode { get; set; }
    public string continent { get; set; }
    public string continentName { get; set; }
    public string capital { get; set; }
    public string areaInSqKm { get; set; }
    public string population { get; set; }
    public string currencyCode { get; set; }
    public string languages { get; set; }
    public int geonameId { get; set; }
    public string west { get; set; }
    public string north { get; set; }
    public string east { get; set; }
    public string south { get; set; }
    public string postalCodeFormat { get; set; }
}
25.05.2018

  • Какие огромные выборочные данные. В любом случае, не могли бы вы поделиться фрагментом своего кода. 25.05.2018
  • Вероятно, дубликат 25.05.2018
  • Не совсем уверен, в чем вопрос, потому что я могу успешно десериализовать ваш json, используя ваши модели и ваш код. Не могли бы вы опубликовать минимальный воспроизводимый пример, который показывает проблему? Я вставил весь ваш код в LINQPad, он успешно запустился и создал GeonamesObject с 250 GeonamesCountry объектами в массиве geonames. Короче говоря, ваш код работает, в чем вопрос? 25.05.2018

Ответы:


1

Вы можете использовать Visual Studio для автоматического создания классов на основе вашей строки json. Скопируйте свою строку json, иди

Правка -> Специальная вставка -> Вставить JSON как классы (Примечание: ваша строка Json должна быть действительной)

затем он создаст для вас классы (примечание: используйте атрибут JsonProperty, чтобы сериализовать / десериализовать член с указанным именем)

public class Rootobject
{
    [JsonProperty("geonames")]
    public Geoname[] Geonames { get; set; }
}


public class Geoname
{
    [JsonProperty("continent")]
    public string Continent { get; set; }

    [JsonProperty("capital")]
    public string Capital { get; set; }

    [JsonProperty("languages")]
    public string Languages { get; set; }

    [JsonProperty("geonameId")]
    public int GeonameId { get; set; }

    [JsonProperty("south")]
    public float South { get; set; }

    [JsonProperty("isoAlpha3")]
    public string IsoAlpha3 { get; set; }

    [JsonProperty("north")]
    public float North { get; set; }

    [JsonProperty("fipsCode")]
    public string FipsCode { get; set; }

    [JsonProperty("population")]
    public string Population { get; set; }

    [JsonProperty("east")]
    public float East { get; set; }

    [JsonProperty("isoNumeric")]
    public string IsoNumeric { get; set; }

    [JsonProperty("areaInSqKm")]
    public string AreaInSqKm { get; set; }

    [JsonProperty("countryCode")]
    public string CountryCode { get; set; }

    [JsonProperty("west")]
    public float West { get; set; }

    [JsonProperty("countryName")]
    public string CountryName { get; set; }

    [JsonProperty("continentName")]
    public string ContinentName { get; set; }

    [JsonProperty("currencyCode")]
    public string CurrencyCode { get; set; }

}

затем десериализуйте его:

var result = JsonConvert.DeserializeObject<Rootobject>(json_string);
25.05.2018
  • Очень полезно. Могу ли я сделать то же самое с xml и csv? 25.05.2018
  • Для xml есть вариант: Правка - ›Специальная вставка -› Вставить XML как классы. Также помните, что ваши строки json или xml должны быть действительными. 25.05.2018

  • 2

    пожалуйста, проверьте, что все должно работать

    GeonamesObject geonamesObject = new GeonamesObject();
    geonamesObject.geonames = 
     Newtonsoft.Json.JsonConvert.DeserializeObject<List<Geonames>>(GeoNamesCountryResult);
    
    25.05.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..