JSON 操纵

JSON manipulation

我正在研究 GitHub API,我想操纵这个 API 的 JSON 响应,所以我有这个 API 代码

    public class TrendRepo
    {
        public IEnumerable<object> Data;
    }

    [HttpGet]
    public async Task<JsonResult> GetTrendingRepos()
    {
        var date = DateTime.Now.AddDays(-30).ToString("yyyy-MM-ddThh:mm:ssZ");

        string trendingReposLanguagesUrl = @"https://api.github.com/search/repositories?q=created:>" + (date) + "&sort=stars&order=desc&per_page=10";

        HttpWebRequest request = WebRequest.CreateHttp(trendingReposLanguagesUrl);
        request.Accept = "application/json";
        request.UserAgent = "request";

        WebResponse response = await request.GetResponseAsync();
        Stream data = response.GetResponseStream();
        StreamReader reader = new StreamReader(data ?? throw new InvalidOperationException());
        var readerResult = await reader.ReadToEndAsync();
        //var jObj2 = JsonConvert.DeserializeObject<dynamic>(readerResult);
        JToken token = JObject.Parse(readerResult);
        var items = token["items"];

        var arr = new List<object>();
        List<dynamic> tripDetailsCollection = new List<dynamic>();

        if (items != null)
        {
            foreach (dynamic o in items)
            {
                arr.Add(o.language);
                arr.Add(o.id);
                arr.Add(o.full_name);
                arr.Add(o.html_url);
                arr.Add("             ");
                tripDetailsCollection.AddRange(arr);
            }
        }
        TrendRepo trendRepo = new TrendRepo()
        {
            Data = arr,
        };
        return new JsonResult(trendRepo);

    }

哪个return这样的回应

{
  "data": [
    "Python",
    319029846,
    "beurtschipper/Depix",
    "https://github.com/beurtschipper/Depix",
    "             ",
    "C++",
    311683390,
    "WerWolv/ImHex",
    "https://github.com/WerWolv/ImHex",
    "             ",
    null,
    316705066,
    "peng-zhihui/PocketLCD",
    "https://github.com/peng-zhihui/PocketLCD",
    "             "
  ]
}

但我想要的是这样的

{
  "data": [
    "Python",
    319029846,
    "full_name":[
        "beurtschipper/Depix",
        "beurtschipper/Depix",
        ],
    "https://github.com/beurtschipper/Depix",
    "             ",
    ]
    "data": [
    "C++",
    311683390,
    "full_name":[
        "beurtschipper/Depix",
        "WerWolv/ImHex",,
        ],
    "https://github.com/WerWolv/ImHex",
    "             ",
    ]
    "data": [
    null,
    316705066,
    "full_name":[
        "beurtschipper/Depix",
        "WerWolv/ImHex",,
        ],
    "https://github.com/peng-zhihui/PocketLCD",
    "             "
  ]
} 

如有任何帮助,我将不胜感激。

@Hazeem,花了点时间看看我们能做些什么让搜索结果更接近您的期望,基本上您定义的方式 JSON 是没有用的,没有人能够解析,我不认为即使是序列化程序也会接受例如数据收集没有用逗号分隔,我将代码捆绑了一点以便更接近您想要的。

代码:

 var tripDetailsCollection = new List<object>();
    var date = DateTime.Now.AddDays(-30).ToString("yyyy-MM-ddThh:mm:ssZ");

    string trendingReposLanguagesUrl = @"https://api.github.com/search/repositories?q=created:>" + (date) + "&sort=stars&order=desc&per_page=10";

    var request = WebRequest.CreateHttp(trendingReposLanguagesUrl);

    request.Accept = "application/json";
    request.UserAgent = "request";

    var response = await request.GetResponseAsync();
    Stream data = response.GetResponseStream();
    JToken token;
    using (var reader = new StreamReader(data ?? throw new InvalidOperationException()))
    {
        var readerResult = await reader.ReadToEndAsync();
        token = JObject.Parse(readerResult);
    } 
    if (token != null)
    {
        var items = token["items"]; 

        if (items != null)
        {
            foreach (dynamic o in items)
            {
                var arr = new
                {
                    data = new List<object>
                {
                    o.language,
                    o.id,
                    o.full_name,
                    o.html_url,
                    "             "
                }
                };
                tripDetailsCollection.Add(arr);
            }
        }
    }
    
    var json = JsonConvert.SerializeObject(tripDetailsCollection);

结果 - 您应该能够遍历该集合并在其他地方使用它。

我需要的是将我的 TrendRepo class 与具有相同 属性 值的 Parent class 和 DeserializeObject 包装起来,而不是这里的答案,如果有任何问题,请随意显而易见。

public class Root
{
    [JsonPropertyName("items")]
    public List<Items> Items { get; set; }
}

public class Items //TrendRepo
{
    [JsonPropertyName("language")]
    public string Language { get; set; }
    [JsonPropertyName("id")]
    public int Id { get; set; }

    [JsonPropertyName("name")]
    public string Name { get; set; }

    [JsonPropertyName("full_name")]
    public string Full_Name { get; set; }
    public string total_count { get; set; }
}

并像这样编辑 API

        var readerResult = await reader.ReadToEndAsync();
        Root jObj2 = JsonConvert.DeserializeObject<Root>(readerResult);

        var result = jObj2.Items.Select(x => new
        {
            x.Language,
            x.Id,
            x.Full_Name,
            x.Name
        }).GroupBy(x => x.Language).ToArray();

        return new JsonResult(result);