fc2ブログ

記事一覧

漢字のふりがなを取得する方法 -Yahoo REST API v2- | Xamarin.Forms


Xamarin.Forms で漢字交じりの文字列からふりがなを取得する為に Yahoo API を使用していますが、その API のバージョンが上がり、アプリ側の実装方法も変更しなければいけませんでした。今回はバージョン2での実装方法についてご紹介いたします。Android と iOS で共通して使用ができます。
尚、ふりがなの取得に Yahoo API を採用した経緯や、API v1 の実装方法につきましては、前回の記事「漢字のふりがなを取得する方法 -Yahoo REST API v1-」をご参考ください。






前提条件
・Windows10 Pro 64Bit 1903
・Visual Studio 2019 Community v16.11.7
・Xamarin 16.11.000.197 (NuGet Xamarin.Forms 4.6.0.1141)
・macOS Monterey 12.0.1 / Xcode 13.1 / Xamarin.iOS 15.2.0.17



1.REST API の使用方法

(1)使用にあたっては Yahoo に事前登録する必要がありますが、登録方法については前回の記事「漢字のふりがなを取得する方法 -Yahoo REST API v1-」をご参考ください。

(2)ルビ振り API の概要を確認します。
https://developer.yahoo.co.jp/webapi/jlp/furigana/v2/furigana.html
基本的には URL に POST を投げてリターンの JSON を取得するだけです。
※V1 では GET でしたが、V2 では POST に仕様変更されています。

(3)POST に含むデータ
主には3種類です。
 ・アプリケーションID。「アプリケーションの管理」→アプリケーション情報にある ClientID です。 HTTP ヘッダーの User-Agent として送信します。
 ・q:ふりがなに変換したい文字列。HTTP ボディの JSON に含めます。
 ・grade:指定しないほうが良いです。grade=8 に設定するとふりがなが取得できません。

(4)制限事項について
API の仕様上の制限事項があります。これも前回の記事「漢字のふりがなを取得する方法 -Yahoo REST API v1-」に記載していますので、ご参考ください。



2.動作をJSONで確認

取得したアプリケーションID(ClientID)と変換したい文字列を含めてPOSTします。
POST先のURL:
  https://jlp.yahooapis.jp/FuriganaService/V2/furigana
HTTPヘッダー:
  "User-Agent" : "Yahoo AppID: {取得したアプリケーションID}"
  "Content-Type" : "application/json; charset=utf-8"

HTTPヘッダーの追加
xamarin_yahoo_rest_api_v2_01.png

HTTP Body の内容とレスポンス内容
xamarin_yahoo_rest_api_v2_02.png


リクエストJSON
{
"id": "1",
"jsonrpc": "2.0",
"method": "jlp.furiganaservice.furigana",
"params": {
"q": "山田太郎"
}
}

レスポンスJSON
{
"id":"1",
"jsonrpc":"2.0",
"result":{
"word":[
{
"furigana":"やまだたろう",
"roman":"yamadatarou",
"surface":"山田太郎"
}
]
}
}

結果を確認するとローマ字にも変換が可能ですね。



3.エンティティを実装

リクエスト・レスポンス時に JSON を受け渡しする為、シリアライズ可能なエンティティを作成します。作成場所は任意ですが、次項の PCL から呼び出し可能なネームスペースとしてください。

リクエスト用のエンティティ
FuriganaRequest.cs
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;
}


レスポンス取得用のエンティティ
FuriganaResponse.cs
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;
}




4.PCLの実装方法

以下の C# コードを PCL に実装します。
HttpClient で変換の URL に送信し、JSON を受信します。
次に取得した JSON の Furigana フィールドに入っているデータを連結してふりがなを完成させます。

YahooAPI.cs
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;
}
}
    }
}

※SerializeManager はクラスから JSON にシリアライズしたり、JSON からクラスにデシリアライズしたりする独自クラスです。実装方法につきましては、以前の記事にて JSON 文字列とオブジェクトの相互の変換方法についてご紹介しておりますので、以下のリンク先をご確認くださいませ。

・JSON形式の文字列データをクラスに変換する方法 -デシリアライズ-
・クラスをJSON形式の文字列データをに変換する方法 -シリアライズ-



5.使用方法

前回のV1と全く同じです。フリガナを取得したい Entry オブジェクトの Completed イベントまたは Unfocused イベントで Yahoo にリクエストします。

RegisterCustomerPage.xaml.cs
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);
});

ちなみに、今回は全角ひらがなに変換していますが、カタカナに変換したい場合は以下の力技ライブラリを用いると良いでしょう。
http://wiki.dobon.net/index.php?free%2FkanaxsCSharp




最後までお読みいただきありがとうございます。
当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
https://itblog.dynaspo.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。