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",
" "
]
}
- 我试图在现有的 foreach 中添加另一个 foreach 来循环
属性 但它给了我相同的结果。
- 此外,我需要 select 一种独特的语言,这很容易做到,但是
诀窍是我想要所有依赖于此的回购名称和计数
数组中的语言,就像上面我想要的 JSON 响应一样。
如有任何帮助,我将不胜感激。
@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);
我正在研究 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",
" "
]
}
- 我试图在现有的 foreach 中添加另一个 foreach 来循环 属性 但它给了我相同的结果。
- 此外,我需要 select 一种独特的语言,这很容易做到,但是 诀窍是我想要所有依赖于此的回购名称和计数 数组中的语言,就像上面我想要的 JSON 响应一样。
如有任何帮助,我将不胜感激。
@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);