解析 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?);
但是我的问题是:
- 如何首先搜索最匹配的坐标,像我的例子中它们不完全匹配,但我需要得到最接近的坐标。
- 找到匹配项后,从 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; }
}
我有一个非常大的 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?);
但是我的问题是:
- 如何首先搜索最匹配的坐标,像我的例子中它们不完全匹配,但我需要得到最接近的坐标。
- 找到匹配项后,从 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; }
}