コメント
コメントの投稿
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。
{
"id": "1",
"jsonrpc": "2.0",
"method": "jlp.furiganaservice.furigana",
"params": {
"q": "山田太郎"
}
}
{
"id":"1",
"jsonrpc":"2.0",
"result":{
"word":[
{
"furigana":"やまだたろう",
"roman":"yamadatarou",
"surface":"山田太郎"
}
]
}
}
using System;
using System.Runtime.Serialization;
/// <summary>
/// Yahoo ふりがな取得APIリクエストクラス
/// </summary>
[DataContract()]
public class FuriganaRequest
{
/// <summary>
/// JSON-RPC 2.0のid。値は任意で、指定した値がレスポンスのidにも返ります。
/// </summary>
[DataMember(Name = "id")]
public string Id { get; set; } = String.Empty;
[DataMember(Name = "jsonrpc")]
public string JsonRpc { get; set; } = String.Empty;
[DataMember(Name = "method")]
public string Method { get; set; } = String.Empty;
[DataMember(Name = "params", EmitDefaultValue = false)]
public Parameters Params { get; set; }
[OnSerializing]
private void OnSerializingObject(StreamingContext sc)
{
Method = "jlp.furiganaservice.furigana";
JsonRpc = "2.0";
}
}
/// <summary>
/// 受け渡すデータ
/// </summary>
[DataContract()]
public class Parameters
{
/// <summary>
/// ふりがなを付ける対象のテキストです。
/// </summary>
[DataMember(Name = "q", EmitDefaultValue = false)]
public string Q { get; set; } = String.Empty;
/// <summary>
/// 学年(注1)を指定します。
/// 1: 小学1年生向け。漢字(注2)にふりがなを付けます。
/// 2: 小学2年生向け。1年生で習う漢字にはふりがなを付けません。
/// 3: 小学3年生向け。1~2年生で習う漢字にはふりがを付けません。
/// 4: 小学4年生向け。1~3年生で習う漢字にはふりがなを付けません。
/// 5: 小学5年生向け。1~4年生で習う漢字にはふりがなを付けません。
/// 6: 小学6年生向け。1~5年生で習う漢字にはふりがなを付けません。
/// 7: 中学生以上向け。小学校で習う漢字にはふりがなを付けません。
/// 8: 一般向け。常用漢字にはふりがなを付けません。
/// 無指定の場合、ひらがなを含むテキストにふりがなを付けます。
/// </summary>
[DataMember(Name = "grade", EmitDefaultValue = false)]
public int? Grade { get; set; } = null;
}
using System;
using System.Runtime.Serialization;
/// <summary>
/// Yahoo ふりがな取得APIレスポンスクラス
/// </summary>
[DataContract()]
public class FuriganaResponse
{
/// <summary>
/// JSON-RPC 2.0のid。リクエストのidの値が返ります。
/// </summary>
[DataMember(Name = "id")]
public string Id { get; set; } = String.Empty;
/// <summary>
/// 固定で「"2.0"」が返ります。
/// </summary>
[DataMember(Name = "jsonrpc")]
public string JsonRpc { get; set; } = String.Empty;
/// <summary>
/// ふりがなを付けた結果を含みます。
/// </summary>
[DataMember(Name = "result", EmitDefaultValue = false)]
public Result Result { get; set; }
/// <summary>
/// エラー情報
/// </summary>
[DataMember(Name = "error", EmitDefaultValue = false)]
public ErrorInfo Error { get; set; }
}
/// <summary>
/// 結果情報
/// </summary>
[DataContract()]
public class Result
{
/// <summary>
/// 単語(注3)のリストを返します。
/// </summary>
[DataMember(Name = "word", EmitDefaultValue = false)]
public List<Word> Words { get; set; }
}
/// <summary>
/// エラー情報
/// </summary>
[DataContract()]
public class ErrorInfo
{
/// <summary>
/// JSON-RPC 2.0の仕様に準拠したエラーコードです。
/// </summary>
[DataMember(Name = "code", EmitDefaultValue = false)]
public string Code { get; set; } = String.Empty;
/// <summary>
/// JSON-RPC 2.0の仕様に準拠したエラーメッセージです。
/// </summary>
[DataMember(Name = "message", EmitDefaultValue = false)]
public string Message { get; set; } = String.Empty;
}
/// <summary>
/// 単語情報
/// </summary>
[DataContract()]
public class Word : Subword
{
/// <summary>
/// 単語が漢字かな交じりのとき、その単語を、さらに細かく漢字部分とひらがな部分に分割した結果のリストを返します。
/// </summary>
[DataMember(Name = "subword", EmitDefaultValue = false)]
public List<Subword> Subwords { get; set; }
}
/// <summary>
/// よみ情報
/// </summary>
[DataContract()]
public class Subword
{
/// <summary>
/// 単語の表記を返します。
/// </summary>
[DataMember(Name = "surface", EmitDefaultValue = false)]
public string Surface { get; set; } = String.Empty;
/// <summary>
/// 単語のよみをひらがなで返します。
/// </summary>
[DataMember(Name = "furigana", EmitDefaultValue = false)]
public string Furigana { get; set; } = String.Empty;
/// <summary>
/// 単語のよみをローマ字で返します。
/// </summary>
[DataMember(Name = "roman", EmitDefaultValue = false)]
public string Roman { get; set; } = String.Empty;
}
using System;
using System.Net.Http;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public static class YahooAPI
{
private const string YahooFuriganaUrl = "https://jlp.yahooapis.jp/FuriganaService/V2/furigana";
/// <summary>
/// 漢字交じりの文字列のふりがなを取得する
/// </summary>
/// <param name="accountId">YahooAPIAppID</param>
/// <param name="kanji">ふりがなを取得したい文字列</param>
/// <returns>ふりがな</returns>
public static async Task<string> GetPhonetic(string accountId, string kanji)
{
HttpClient client = null;
try
{
//HttpClientを用いた接続例
client = new System.Net.Http.HttpClient();
var uri = new Uri(YahooFuriganaUrl);
client.BaseAddress = uri;
//HTTPヘッダーを設定
client.DefaultRequestHeaders.Host = uri.Host;
client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", string.Format("Yahoo AppID: {0}", accountId));
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8");
//JSONの内容を定義
var request = new FuriganaRequest
{
Id = "1", //リクエスト毎の識別番号(連番等)を採番できると良いです。
Params = new Parameters
{
Q = kanji
}
};
var json = SerializeManager.GetJsonFromObject(request);
var content = new StringContent(json, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync(uri, content);
json = response.Content.ReadAsStringAsync().Result;
var res = SerializeManager.GetObjectFromJson<FuriganaResponse>(json);
if (res.Error != null)
{
throw new Exception(string.Format("code={0},message={1}", res.Error.Code, res.Error.Message));
}
//取得したFuriganaを全て連結した文字列を返却する
return string.Join("", res.Result.Words.Select(r => r.Furigana));
}
catch (System.Net.Http.HttpRequestException hre)
{
System.Diagnostics.Debug.WriteLine(hre.Message + System.Environment.NewLine + hre.StackTrace);
return String.Empty;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message + System.Environment.NewLine + ex.StackTrace);
return String.Empty;
}
finally
{
if (client != null)
{
client.Dispose();
client = null;
}
}
}
}
this.txtFirstName.Completed += (async (s, e) =>
{
this.txtFirstNameKana.Text = await YahooAPI.GetPhonetic("YahooAppId", this.txtFirstName.Text);
});
this.txtLastName.Completed += (async (s, e) =>
{
this.txtLastNameKana.Text = await YahooAPI.GetPhonetic("YahooAppId", this.txtLastName.Text);
});
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。