【发布时间】:2021-06-04 13:38:42
【问题描述】:
下面的代码显示了我如何使用 Newtonsoft.Json 将 geoJSON 文件读取/反序列化为 ExpandoObject。
当我在遍历项目时,如何测试项目是否包含属性 place?
或者我可以在 LINQ 查询中执行此操作吗?
可以看出我已经尝试了this page 的几种方法,都没有工作
var PPL = new List<string> { "city", "farm", "hamlet", "isolated_dwelling", "neighbourhood", "quarter", "suburb", "town", "village" };
....
JsonSerializer serializer = new JsonSerializer();
using (FileStream s = File.Open(jsonFile, FileMode.Open))
using (StreamReader sr = new StreamReader(s, Encoding.UTF8))
using (JsonReader reader = new JsonTextReader(sr))
{
while (reader.Read())
{
// deserialize only when there's "{" character in the stream
if (reader.TokenType == JsonToken.StartObject)
{
dynamic jsonFeatures = serializer.Deserialize<ExpandoObject>(reader);
foreach (var item in jsonFeatures.features)
{
if(HasAttr(item, "place"))
//if (((IDictionary<String, object>)item).ContainsKey("place"))
//if (item.ContainsKey("place"))
{
// Some fixed attributes
var osm_id = item.properties.osm_id ?? string.Empty;
string name = item.properties.name ?? string.Empty;
string is_in = item.is_in ?? string.Empty;
string Place = item.place ?? string.Empty;
string geom = JsonConvert.SerializeObject(item.geometry);
bool IsPPL = PPL.Contains(Place, StringComparer.OrdinalIgnoreCase);
if (IsPPL)
{
Console.WriteLine("name: {0} is_in: {1} Place: {2} geom: {3} ", name, is_in, Place, geom);
}
}
}
}
}
}
private static bool HasAttr(ExpandoObject expando, string key)
{
return ((IDictionary<string, Object>)expando).ContainsKey(key);
}
【问题讨论】: