从 API 中,我收到以下形式的 json 文件:
{
"location": {
"name": "name",
"region": "region",
"country": "Russia",
"lat": xx.xx,
"lon": yy.yy,
"tz_id": "xx/yy",
"localtime_epoch": 11111111,
"localtime": "2023-08-18 23:38"
},
"current": {
"last_updated_epoch": 1692390600,
"last_updated": "2023-08-18 23:30",
"temp_c": 21.0,
"is_day": 0,
"condition": {
"text": "Ясно",
"icon": "//cdn.weatherapi.com/weather/64x64/night/116.png",
"code": 1003
},
"wind_kph": 15.1,
"wind_degree": 20,
"wind_dir": "NNE",
"pressure_mb": 1025.0,
"pressure_in": 30.27,
"precip_mm": 0.8,
"humidity": 78,
"cloud": 50,
"feelslike_c": 21.0,
"vis_km": 10.0,
"uv": 1.0,
"gust_kph": 21.6
}
}
我还有一个Weather
包含以下字段的类:
public string LastUpdate;
public double TemperatureCelsius; // в json: current -> temp_c
public double FeelsLikeCelsius;
public string Discription; // в json: current -> condition -> text
public double WindSpeed;
public string WindDirection;
public double Pressure;
public double Precipitation;
public int Humidity;
public int Cloud;
public int UvIndex;
public bool IsDay;
所以这是JsonConvert.DeserializeObject<Weather>
行不通的。当然,我可以反序列化为具有许多嵌套字典的字典,但这个选项的可读性不太好,因此令我反感。如何以更优雅的方式从文件附件(例如从current
-> condition
get value text
)获取数据,而不在类中创建我不需要的字段?
如果问题是将某些对象字段绑定到某些 json 字段:
如果您想指定此字段的路径而不是简单的字段名称,那么此解决方案适合您:
System.Text.Json的解决方案:
我想了很久,还是对标准库做了一个相当简单的解决方案:
该方法可以让你在JsonPropertyName中指定json路径,也可以在不指定路径时使用字段名,并且支持自定义
PropertyNamingPolicy
(来自下面的解决方案)用法:
Newtonsoft.Json 的解决方案:
我建议您使用 Newtonsoft.Json,因为它提供了非常强大的 json 功能并且更可定制。
用法:
如果问题出在命名策略中:
如果问题是按照命名方法(如
ObjectName
和object_name
),那么你就在这里System.Net.Json的解决方案:
用法:
Newtonsoft.Json 的解决方案:
此任务的解决方案已内置到库中:
找到了一个可能的解决方案 - 使用
dynamic
. 是的,最好不要滥用它,因为捕获状态更困难,但特别是在我的情况下,解决方案还不错。更改:结果,我放弃了这样的解决方案,并按照评论中的建议创建了几个帮助器类。