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

如何用RestEase与Newtonsoft.Json提取Google Trends首个Widget的Token?

你之前尝试用[JsonProperty("widgets[0].token")]直接映射属性的方法行不通,是因为Newtonsoft.Json的JsonPropertyAttribute只负责映射当前类的属性到JSON结构里的同级属性名,并不支持这种带数组索引的路径式写法。下面给你两种可行的解决方案:

方案1:创建匹配响应结构的嵌套类(推荐)

这种方式更符合RestEase和Newtonsoft.Json的序列化规范,也更易维护:

首先定义对应的实体类:

// 单个Widget的结构
public class Widget
{
    [JsonProperty("token")]
    public string Token { get; set; }
    // 如果需要其他Widget属性,可以在这里添加
}

// 匹配API响应的根类
public class TrendsResponse
{
    [JsonProperty("widgets")]
    public List<Widget> Widgets { get; set; }
    // 响应里的其他顶层属性如果需要也可以添加
}

然后在你的RestEase接口里,指定返回类型为TrendsResponse:

public interface IGoogleTrendsApi
{
    [Get("/trends/api/explore")]
    Task<TrendsResponse> GetExploreData(
        [Query("hl")] string language = "en-US",
        [Query("tz")] int timeZone = -180,
        [Query("req")] string requestPayload = "{\"comparisonItem\":[{\"keyword\":\"react\",\"geo\":\"\",\"time\":\"today 12-m\"}],\"category\":0,\"property\":\"\"}"
    );
}

调用的时候直接取第一个Widget的Token:

var api = RestClient.For<IGoogleTrendsApi>("https://trends.google.com");
var response = await api.GetExploreData();
var firstToken = response.Widgets?.FirstOrDefault()?.Token;

方案2:直接解析原始JSON响应(无需完整类结构)

如果不想创建全套的实体类,可以利用RestEase的RawResponse来获取原始的JSON字符串,再用Newtonsoft.Json的Linq to Json功能提取目标值:

修改你的RestEase接口,返回Task<HttpResponseMessage>:

public interface IGoogleTrendsApi
{
    [Get("/trends/api/explore")]
    Task<HttpResponseMessage> GetExploreRawData(
        [Query("hl")] string language = "en-US",
        [Query("tz")] int timeZone = -180,
        [Query("req")] string requestPayload = "{\"comparisonItem\":[{\"keyword\":\"react\",\"geo\":\"\",\"time\":\"today 12-m\"}],\"category\":0,\"property\":\"\"}"
    );
}

然后调用并解析:

var api = RestClient.For<IGoogleTrendsApi>("https://trends.google.com");
var response = await api.GetExploreRawData();
var jsonString = await response.Content.ReadAsStringAsync();

// 注意:Google Trends的API响应开头可能有多余的")]}'\n"前缀,需要先去除
var cleanJson = jsonString.TrimStart(new[] { ')', ']', '\'', '}' });
var jsonObj = JObject.Parse(cleanJson);
var firstToken = jsonObj["widgets"]?[0]?["token"]?.ToString();

小提示:Google Trends的API响应通常会在开头加上)]}'\n这样的防XSS前缀,所以解析前一定要先清理掉,否则会抛出JSON解析错误。

内容的提问来源于stack exchange,提问作者Pyrejkee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:05:21