如何用RestEase与Newtonsoft.Json提取Google Trends首个Widget的Token?
解决RestEase解析Google Trends API响应提取首个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
相关产品推荐
相关产品推荐

