解析 json 并使用 System.Text.Json 获取值

Parse json and get values using System.Text.Json

我有一个非常大的 json 文件,其中包含大量数据。结构看起来像这样

 {
    "country": "AD",
    "name": "Pas de la Casa",
    "lat": "42.54277",
    "lng": "1.73361"
  },

在我当前的 c# 代码中我有坐标,比方说

var lat = "42.53";
var lng = "1.74";

有没有什么方法可以读取 JSON 而无需首先将其完全解析到内存中,因为文件非常大,大约 12 Mb。有人可以提供一些代码示例如何使用 System.Text.Json.

来完成吗

我知道我应该创建一个 class,例如:

public class Location
{
    public string Country { get; set; }
    public string City { get; set; }
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

然后反序列化呢?

Location location = 
                JsonSerializer.Deserialize<Location>(filepath?);

但是我的问题是:

  1. 如何首先搜索最匹配的坐标,像我的例子中它们不完全匹配,但我需要得到最接近的坐标。
  2. 找到匹配项后,从 JSON 中获取国家和城市。

嗯,首先 12Mb 似乎不是一个很大的文件 - 但这取决于您。

您可以创建自定义集合,实现 ICollection<Location>.Add(例如,继承自 Collection<Location>)方法并在那里过滤 Location 的反序列化实例。

例如:

public class FilteredLocationCollection: Collection<Location>
{
   public FilterCollection(double lat, double lng)
   { 
      Lat = lat;
      Lng = lng;
   }

   public double Lat { get; }
   public double Lng { get; }

   protected override void InsertItem(int index, Location item)
   {
      if (item.Latitude == Lat && item.Longitude == Lng) /* here check item for corresponding to desired Lat\Lng */)
        base.InsertItem(index, item);
   }
}

然后,您将能够反序列化:

var locations = JsonSerializer.Deserialize<FilteredLocationCollection>(filepath?);

并且 locations 将仅包含符合您条件的那些实例。

顺便说一句,要将您的 JSON 正确反序列化为 Location 实例,您应该为字段提供属性(只要 JSON 中的 属性 名称不匹配class) 中的属性名称:

public class Location
{
    [JsonPropertyName('country')]
    public string Country { get; set; }
    [JsonPropertyName('name')]
    public string City { get; set; }
    [JsonPropertyName('lat')]
    public double Latitude { get; set; }
    [JsonPropertyName('lng')]
    public double Longitude { get; set; }
}