C#: 新検索β api v2

知らぬ間に新しくなってて古いAPIが消えてた

json

(これ冷静に気持ち悪いな)

{
    "value": {
        "kanon": "ff", 
        "sadone": 1
    }
}

上記の例のように、同じ配列の中でも<string, int>とか<string, string>とかに定まってくれないから時々object型で受ける必要が出てくる。
Web系が生み出したモンスターなだけあって型に無頓着なんだな

シリアライズ

エラーが起きたらHttpResponseMessageの response.Content.ReadAsStringAsync().Result を見る。
GETで送れってドキュメントにあったけど、Json.NETでシリアライズして試しにPOSTで送ったらクエリエラー。
公式で指示されてるとおりURIを成型して送るしかやり方ないのかねー
(めんどくせー)

愚かしいURI成型

string CreateUri(Query query)
{
    var sb = new System.Text.StringBuilder();
    sb.Append("?");
    var queryInfo = query.GetType().GetProperties();
    foreach (var prop in queryInfo)
    {
        if (prop.Name == "filters")
        {
            var filter = query.filters;
            foreach (KeyValuePair<string, object> pair in filter)
            {
                sb.Append($"filters[{pair.Key}][0]={pair.Value}&");
            }
        }
        else
        {
            sb.Append($"{prop.Name}={prop.GetValue(query)}&");
        }
    }
    sb.Remove(sb.Length - 1, 1);

    return sb.ToString();
}

Queryは旧新検索用のクエリをシリアライズする用に作った自作クラス。
プロパティにqとかfieldsとか作って格納した後にこの関数に投げるだけ。

filtersにはliveStatus=onairとproviderType=communityしか入れないつもりだからこういう制御([0]付与したり)になってるけど、startTimeとかを入れたいならgteみたいなステータスを用いることになるので注意。

リフレクションだから遅いだろうなぁこれ
めんどいからPOST受け付けるようにしてくれよ

シリアライズ

[Newtonsoft.Json.JsonObject("meta")]
public class Meta
{
    public int status { get; set; }

    public int totalCount { get; set; }

    public string id { get; set; }
}

[Newtonsoft.Json.JsonObject("data")]
public class Data
{
    public string startTime { get; set; }

    public string description { get; set; }

    public string tags { get; set; }

    public int viewCounter { get; set; }

    public string contentId { get; set; }

    public int commentCounter { get; set; }

    public string title { get; set; }

    public bool memberOnly { get; set; }

    public int communityId { get; set; }
}

こういうクラスを作っておいて

var dic = JsonConvert.DeserializeObject<Dictionary<string, object>>(resJson);
var metaData = JsonConvert.DeserializeObject<Meta>(dic["meta"].ToString());
var bodyData = JsonConvert.DeserializeObject<List<Data>>(dic["data"].ToString());

Json.NETでデシリアライズします。
dataの方は複数あるので一旦listで受けます。
その後の処理とかも結構簡潔に書けるようになりました。

リフレクションとか挟んでるけどv1の時の処理が若干煩雑なことしてたから、差し引きして動作は比較的軽快になった。
他にも直したいところあるからそっちやったらリリースか

memberOnlyとかcommunityId、あとfiltersのproviderTypeとかは公式ドキュメントに記載されてないけど機能します。
(記載しとけよ)