如何测试动态 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

然后您可以检查属性是否已填充。