c# - 如何使用 Newtonsoft 转换没有名称的 json 字符串?
问题描述
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),例如可以从 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; }
}
解决方案
您可以使用 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);
推荐阅读
- django - Django 消息 - 在添加之前检查消息是否已经存在
- java - 构建 APK(s):构建 APK 时出错。您可以在“消息”视图中找到错误
- python - 基于Dataframe中逗号分隔列中的文本分组
- python - Python:运行第二个单元测试后的 Paramiko 单元测试异常
- javascript - 隐藏悬停问题的下拉菜单
- android - 如何检查扫描的文档是否包含地址
- angular - PathLocationStrategy 和 webpack-dev historyApiFallback 重写
- django - Django - Bootstrap4 - DateRangePicker - django-bootstrap-datepicker-plus
- operating-system - 如何在后台模拟屏幕?
- css - React Native 中的 Flexbox:如何在屏幕中心对齐 2 个项目?