知らぬ間に新しくなってて古いAPIが消えてた
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とかは公式ドキュメントに記載されてないけど機能します。
(記載しとけよ)