C# JSON操作

C# JSON操作,c#,json,foreach,github-api,C#,Json,Foreach,Github Api,我正在处理GitHub API,我想操纵这个API的JSON响应,所以我有这个API代码 public class TrendRepo { public IEnumerable<object> Data; } [HttpGet] public async Task<JsonResult> GetTrendingRepos() { var date = DateTime.Now.AddDays

我正在处理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);

    }
但我想成为这样的人

{
  "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",
    "             "
  ]
} 
        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);
  • 我试着在现有的foreach中添加另一个foreach到循环中 但它给了我同样的结果
  • 此外,我需要选择一种独特的语言,这很容易做到,但 诀窍在于我想要所有依赖于此的回购协议名称和数量 数组中的语言,如上面我想要的JSON响应

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

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

代码:

var tripDetailsCollection=new List();
var date=DateTime.Now.AddDays(-30).ToString(“yyyy-MM-ddThh:MM:ssZ”);
字符串trendingReposLanguagesUrl=@”https://api.github.com/search/repositories?q=created:>“+(日期)+”&sort=stars&order=desc&per_page=10”;
var request=WebRequest.CreateHttp(trendingReposLanguagesUrl);
request.Accept=“application/json”;
request.UserAgent=“request”;
var response=wait request.GetResponseAsync();
流数据=response.GetResponseStream();
JToken代币;
使用(var reader=new StreamReader(数据??抛出新的invalidoOperationException())
{
var readerResult=wait reader.ReadToEndAsync();
token=JObject.Parse(readerResult);
} 
if(令牌!=null)
{
var items=令牌[“items”];
如果(项!=null)
{
foreach(项目中的动态o)
{
var arr=新
{
数据=新列表
{
o、 语言,
o、 身份证,
o、 全名,
o、 html_网址,
"             "
}
};
tripDetailsCollection.Add(arr);
}
}
}
var json=JsonConvert.SerializeObject(tripDetailsCollection);
结果-您应该能够在集合中循环并在其他地方使用它


我需要的是用具有相同属性值和反序列化对象的父类包装TrendRepo类,而不是这里的答案,如果有任何不明显的地方,请放心

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; }
}
公共类根目录
{
[JsonPropertyName(“项目”)]
公共列表项{get;set;}
}
公共类项目//趋势报告
{
[JsonPropertyName(“语言”)]
公共字符串语言{get;set;}
[JsonPropertyName(“id”)]
公共int Id{get;set;}
[JsonPropertyName(“名称”)]
公共字符串名称{get;set;}
[JsonPropertyName(“全名”)]
公共字符串全名{get;set;}
公共字符串总计数{get;set;}
}
然后像这样编辑API

{
  "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",
    "             "
  ]
} 
        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);
var readerResult=wait reader.ReadToEndAsync();
根作业J2=JsonConvert.DeserializeObject(readerResult);
var result=jObj2.Items.Select(x=>new
{
x、 语言,
x、 身份证,
x、 全名,
x、 名字
}).GroupBy(x=>x.Language).ToArray();
返回新的JsonResult(result);

我想我明白了。您需要做的是创建一个定义了您想要做什么的类。您想要应用的标识是因为该字段需要声明为数组。我尝试这样做,但即使在向类添加新属性时,它也只会复制响应。这没有任何区别,因为这不是我面临的确切问题,正如我提到的,我希望操纵JSON响应,并能够为我所使用的每种语言放置对象have@hazem代码更新了,让我们看看这个是否有用。哦,非常感谢你的帮助,除非我已经找到了一种方法,但我显然会接受这个解决方案,因为这是用同样的、更好的代码实现我的要求,但是如果你不介意你有什么想法,告诉我如何合并或组合同一语言的对象,例如,如果我有两个Python对象,我想将它们组合在一起,并列出该语言下的剩余数据。Python用适当的标记提出一个新问题,其中包含所有相关细节,但不确定这是回答与此线程无关的任何问题的地方。请参见此->