You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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();
    }
}

关键优化说明

  1. 替换文件读取为HTTP GET请求:用HttpClient.GetStringAsync专门获取远程JSON内容,解决了本地文件读取的错误。
  2. 可选强类型序列化:如果想避免动态类型的潜在问题,可以创建对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:52:01