如何测试动态 JSON 文件中是否存在属性
How do you test if an attribute exists in a dynamic JSON file
下面的代码显示了我如何使用 Newtonsoft.Json.
将 geoJSON 文件读取/反序列化为 ExpandoObject
当我循环浏览项目时,如何测试项目是否包含属性 place?
或者我可以在 LINQ 查询中执行此操作吗?
可以看出,我尝试了 this page 中的几种方法 none 都有效
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);
}
Newtonsoft returns 调用了一个 JObject when DeserializeObject 方法。
dynamic jsonFeatures = JsonConvert.DeserializeObject(jsonContent);
JObject 有一个 Contains 方法,您可以这样使用:
jsonFeatures.ContainsKey("your_key");
甚至在这样的嵌套对象中:
jsonFeatures.nestedObject.ContainsKey("your_key");
也许看看 GeoJson-Net
这样的库也很有用
我会尝试使用 this and then deserialize it to this Class.
等服务将 Json 文件转换为 Class
你可以试试这个 fiddle:
https://dotnetfiddle.net/wwu20E
如果您想玩 geoJson.net,我已经准备了一些东西来检索与您可能拥有的文件类似的文件:
https://dotnetfiddle.net/47ohAA
然后您可以检查属性是否已填充。
下面的代码显示了我如何使用 Newtonsoft.Json.
将 geoJSON 文件读取/反序列化为 ExpandoObject当我循环浏览项目时,如何测试项目是否包含属性 place?
或者我可以在 LINQ 查询中执行此操作吗?
可以看出,我尝试了 this page 中的几种方法 none 都有效
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);
}
Newtonsoft returns 调用了一个 JObject when DeserializeObject 方法。
dynamic jsonFeatures = JsonConvert.DeserializeObject(jsonContent);
JObject 有一个 Contains 方法,您可以这样使用:
jsonFeatures.ContainsKey("your_key");
甚至在这样的嵌套对象中:
jsonFeatures.nestedObject.ContainsKey("your_key");
也许看看 GeoJson-Net
这样的库也很有用我会尝试使用 this and then deserialize it to this Class.
等服务将 Json 文件转换为 Class你可以试试这个 fiddle:
https://dotnetfiddle.net/wwu20E
如果您想玩 geoJson.net,我已经准备了一些东西来检索与您可能拥有的文件类似的文件:
https://dotnetfiddle.net/47ohAA
然后您可以检查属性是否已填充。