如何用C#每秒动态更新myjson.com中JSON文件的经纬度?
如何用C#每秒更新远程JSON文件的经纬度?
问题分析
你的代码存在几个关键问题,导致JSON文件更新失败:
- 用
File.ReadAllText(url)读取远程URL是错误的——这个方法仅适用于读取本地文件,无法发起HTTP请求获取远程内容。 - 修改后的JSON对象没有序列化为JSON字符串,就直接传给PUT方法,导致请求内容格式错误。
- PUT请求实现中吞掉了所有异常,无法排查请求失败的原因,也没有处理响应来确认更新是否成功。
- 缺少每秒执行一次更新的循环逻辑。
修正后的完整解决方案
我们改用更现代简洁的HttpClient处理HTTP请求(替代老旧的WebRequest),同时完善错误处理和循环逻辑。首先确保你已通过NuGet安装Newtonsoft.Json(Json.NET)包:
Install-Package Newtonsoft.Json
以下是可直接运行的完整代码:
using System; using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; public class JsonLocationUpdater { // 远程JSON文件的访问地址 private const string TargetJsonUrl = "https://api.myjson.com/bins/1crza2"; private static readonly HttpClient _httpClient = new HttpClient(); public static async Task StartContinuousUpdates() { while (true) { try { // 1. 获取当前远程JSON内容 string currentJson = await _httpClient.GetStringAsync(TargetJsonUrl); // 2. 反序列化为动态对象(也可以用下面的强类型类更安全) dynamic jsonData = JsonConvert.DeserializeObject(currentJson); // 3. 更新经纬度(这里模拟随机变化,替换成你的实际数据源即可) jsonData.Latitude = GenerateRandomLatitude(); jsonData.Longitude = GenerateRandomLongitude(); // 4. 将修改后的对象重新序列化为JSON字符串 string updatedJson = JsonConvert.SerializeObject(jsonData, Formatting.Indented); // 5. 发送PUT请求更新远程文件 var requestContent = new StringContent(updatedJson, System.Text.Encoding.UTF8, "application/json"); HttpResponseMessage response = await _httpClient.PutAsync(TargetJsonUrl, requestContent); // 6. 验证请求是否成功,失败则抛出异常便于排查 response.EnsureSuccessStatusCode(); Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 更新成功:纬度={jsonData.Latitude:F6},经度={jsonData.Longitude:F6}"); } catch (Exception ex) { Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 更新失败:{ex.Message}"); } // 等待1秒后执行下一次更新 await Task.Delay(1000); } } // 模拟生成接近初始值的随机纬度 private static double GenerateRandomLatitude() { var rnd = new Random(); return 1.33 + rnd.NextDouble() * 0.02; } // 模拟生成接近初始值的随机经度 private static double GenerateRandomLongitude() { var rnd = new Random(); return 103.73 + rnd.NextDouble() * 0.02; } // 程序入口 public static void Main() { StartContinuousUpdates().Wait(); } }
关键优化说明
- 替换文件读取为HTTP GET请求:用
HttpClient.GetStringAsync专门获取远程JSON内容,解决了本地文件读取的错误。 - 可选强类型序列化:如果想避免动态类型的潜在问题,可以创建对应JSON结构的类,反序列化时更安全:
public class SystemMetadata { public string SystemId { get; set; } public string SystemName { get; set; } public string SensorType { get; set; } public double Latitude { get; set; } public double Longitude { get; set; } }
此时反序列化代码改为:var jsonData = JsonConvert.DeserializeObject<SystemMetadata>(currentJson);
3. 完善PUT请求处理:添加响应验证response.EnsureSuccessStatusCode(),HTTP状态码异常时会直接抛出,方便排查权限、URL错误等问题。
4. 可视化错误信息:捕获异常并输出具体错误,避免之前吞掉异常导致无法定位问题。
5. 实现每秒循环:用while(true)配合Task.Delay(1000)实现定时更新逻辑。
额外注意事项
- 确认目标JSON文件的可编辑权限:如果遇到403/401错误,检查myjson.com上该文件的权限设置。
- 注意API限流:频繁PUT请求可能触发限流(429错误),可根据实际情况调整请求间隔。
内容的提问来源于stack exchange,提问作者user2399158
相关产品推荐
相关产品推荐

