개발-일반

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);
}