개발-일반
json path
개발문어
2023. 2. 8. 01:12
https://www.newtonsoft.com/json/help/html/QueryJsonSelectTokenJsonPath.htm
Querying JSON with complex JSON Path
JObject o = JObject.Parse(@"{ 'Stores': [ 'Lambton Quay', 'Willis Street' ], 'Manufacturers': [ { 'Name': 'Acme Co', 'Products': [ { 'Name': 'Anvil', 'Price': 50 } ] }, { 'Name': 'Contoso', 'Products': [ { 'Name': 'Elbow Grease', 'Price': 99.95 }, { 'Name'
www.newtonsoft.com
XPath 처럼 파싱해서 뽑는법도 있군요;
그동안 디시리얼라이즈용 클래스가 있어야하는줄 알았더니
유튜브 채널 피쳐드 제목 조회수 구독자 동영상id (영상/쇼츠) 뽑기
using Newtonsoft.Json.Linq;
string srcpath = ".";
string keyword = "";
if (args.Length > 0) srcpath = args[0];
if (args.Length > 1) keyword = args[1];
Console.WriteLine("videoid : " + keyword);
Console.WriteLine("path : " + Path.GetFullPath(srcpath));
string[] files = Directory.GetFiles(srcpath, "*.htm");
List<string> list = new List<string>();
list.AddRange(files);
list.Sort();
foreach (var file in list)
{
//if (keyword == "") Console.WriteLine(file);
string timestamp = betweenStrings(file, "_", ".htm");
string html = File.ReadAllText(file);
string json = betweenStrings(html, "var ytInitialData = ", ";</script>");
JObject o = JObject.Parse(json);
var subs = o.SelectToken("$..subscriberCountText.simpleText");
if (subs == null) continue;
string subcnt = subs.ToString().ToString().Replace("구독자 ", "").Replace("명", "");
var tokens = o.SelectTokens("$..gridVideoRenderer");
foreach (var token in tokens)
{
var renderer = token.ToObject<JObject>();
if (renderer == null) continue;
var id = renderer.SelectToken("$.videoId");
if (keyword != "" && !id.ToString().Contains(keyword)) continue;
var title = renderer.SelectToken("$..title.simpleText");
var count = renderer.SelectToken("$..viewCountText.simpleText").ToString().Replace("조회수 ", "").Replace("회", "").Replace(",", "");
Console.WriteLine(timestamp + "," + id +"," + count + "," + subcnt + "," + title + " ");
}
tokens = o.SelectTokens("$..reelItemRenderer");
foreach (var token in tokens)
{
var renderer = token.ToObject<JObject>();
if (renderer == null) continue;
var id = renderer.SelectToken("$.videoId");
if (keyword != "" && !id.ToString().Contains(keyword)) continue;
var title = renderer.SelectToken("$..headline.simpleText");
var count = renderer.SelectToken("$..viewCountText.simpleText");
Console.WriteLine(timestamp + "," + id + "," + count + "," + subcnt + "," + title + " ");
}
}
static String betweenStrings(String text, String start, String end)
{
int p1 = text.IndexOf(start) + start.Length;
int p2 = text.IndexOf(end, p1);
if (end == "") return (text.Substring(p1));
else return text.Substring(p1, p2 - p1);
}