{"id":1312,"date":"2025-03-24T08:52:22","date_gmt":"2025-03-23T23:52:22","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=1312"},"modified":"2025-03-24T08:52:22","modified_gmt":"2025-03-23T23:52:22","slug":"%e3%80%90%e4%bf%9d%e5%ad%98%e7%89%88%e3%80%91ruby%e3%81%a7json%e3%82%92%e6%89%b1%e3%81%86%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bc%81%e5%ae%9f%e8%b7%b5%e7%9a%84%e3%81%aa7%e3%81%a4%e3%81%ae","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=1312","title":{"rendered":"\u3010\u4fdd\u5b58\u7248\u3011Ruby\u3067JSON\u3092\u6271\u3046\u5b8c\u5168\u30ac\u30a4\u30c9\uff01\u5b9f\u8df5\u7684\u306a7\u3064\u306e\u4f7f\u3044\u65b9\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Ruby\u3067JSON\u3092\u4f7f\u3046\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30eajson\u306e\u7279\u5fb4\u3068\u57fa\u672c\u6a5f\u80fd<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-2\">\u2018json\u2019\u3067\u4f7f\u3048\u308b\u3088\u3046\u306b\u306a\u308b\u4e3b\u8981\u30e1\u30bd\u30c3\u30c9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-3\">JSON\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u3068\u89e3\u6790\u624b\u9806<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-4\">JSON.parse\u3067\u6587\u5b57\u5217\u304b\u3089Ruby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3078\u306e\u5909\u63db\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-5\">\u30b7\u30f3\u30dc\u30eb\u30ad\u30fc\u3068\u6587\u5b57\u5217\u30ad\u30fc\u306e\u9055\u3044\u3068\u4f7f\u3044\u65b9<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-6\">Ruby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304b\u3089JSON\u3078\u306e\u5909\u63db\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-7\">to_json\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3063\u305f\u57fa\u672c\u7684\u306a\u5909\u63db\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-8\">JSON.generate\u3092\u4f7f\u3063\u305f\u67d4\u8edf\u306a\u51fa\u529b\u5236\u5fa1<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-9\">\u5b9f\u8df5\u7684\u306aJSON\u30c7\u30fc\u30bf\u51e6\u7406\u30d1\u30bf\u30fc\u30f3<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-10\">\u30cd\u30b9\u30c8\u3055\u308c\u305fJSON\u69cb\u9020\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">\u914d\u5217\u8981\u7d20\u3092\u542b\u3080JSON\u306e\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-12\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-13\">JSON::ParserError\u306e\u6b63\u3057\u3044\u5bfe\u51e6\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-14\">\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3068\u30b5\u30cb\u30bf\u30a4\u30ba\u306e\u91cd\u8981\u6027<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-15\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-16\">\u5927\u898f\u6a21\u306aJSON\u30c7\u30fc\u30bf\u51e6\u7406\u306e\u52b9\u7387\u5316\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-17\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u8003\u616e\u3057\u305f\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-18\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8003\u616e\u4e8b\u9805\u3068\u5bfe\u7b56<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-19\">JSON\u30c7\u30fc\u30bf\u51e6\u7406\u306b\u304a\u3051\u308b\u4e00\u822c\u7684\u306a\u8106\u5f31\u6027<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-20\">\u5b89\u5168\u306aJSON\u30d1\u30fc\u30b9\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Ruby\u3067JSON\u3092\u4f7f\u3046\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30eajson\u306e\u7279\u5fb4\u3068\u57fa\u672c\u6a5f\u80fd<\/h3>\n\n\n\n<p>Ruby\u3067\u306f\u3001JSON\u30c7\u30fc\u30bf\u3092\u6271\u3046\u305f\u3081\u306e\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u300cjson\u300d\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u7279\u5fb4\u3092\u6301\u3063\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u3068\u3057\u3066\u306e\u4fe1\u983c\u6027<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ruby 1.9\u4ee5\u964d\u306b\u6a19\u6e96\u3067\u7d44\u307f\u8fbc\u307e\u308c\u3066\u3044\u308b<\/li>\n\n\n\n<li>\u5e83\u7bc4\u306a\u30c6\u30b9\u30c8\u3068\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u306b\u3088\u308b\u691c\u8a3c<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u9ad8\u3044\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u8a00\u8a9e\u306b\u3088\u308b\u5b9f\u88c5\uff08<code>json<\/code>gem\uff09<\/li>\n\n\n\n<li>\u5927\u898f\u6a21\u306aJSON\u30c7\u30fc\u30bf\u306e\u51e6\u7406\u306b\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u51e6\u7406<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8c4a\u5bcc\u306a\u6a5f\u80fd\u30bb\u30c3\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JSON\u30d1\u30fc\u30b9\uff08\u6587\u5b57\u5217\u2192Ruby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\uff09<\/li>\n\n\n\n<li>JSON\u751f\u6210\uff08Ruby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u2192\u6587\u5b57\u5217\uff09<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u53ef\u80fd\u306a\u30aa\u30d7\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u69d8\u3005\u306aRuby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3068\u306e\u76f8\u4e92\u5909\u63db<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u2018json\u2019\u3067\u4f7f\u3048\u308b\u3088\u3046\u306b\u306a\u308b\u4e3b\u8981\u30e1\u30bd\u30c3\u30c9<\/h3>\n\n\n\n<p>\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u300cjson\u300d\u3092\u4f7f\u7528\u3059\u308b\u305f\u3081\u306b\u3001\u307e\u305a\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u8aad\u307f\u8fbc\u307f\u3092\u884c\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'json'<\/pre>\n\n\n\n<p>\u4e3b\u8981\u306a\u30e1\u30bd\u30c3\u30c9\u3068\u4f7f\u7528\u4f8b\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>JSON.parse<\/strong>: JSON\u6587\u5b57\u5217\u3092Ruby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u5909\u63db<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\njson_str = '{\"name\": \"\u7530\u4e2d\", \"age\": 30}'\ndata = JSON.parse(json_str)\nputs data[\"name\"]  # =&gt; \"\u7530\u4e2d\"\n\n# \u30b7\u30f3\u30dc\u30eb\u30ad\u30fc\u3067\u30d1\u30fc\u30b9\u3059\u308b\u5834\u5408\ndata = JSON.parse(json_str, symbolize_names: true)\nputs data[:name]   # =&gt; \"\u7530\u4e2d\"<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>JSON.generate<\/strong>: Ruby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092JSON\u6587\u5b57\u5217\u306b\u5909\u63db<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\ndata = { name: \"\u7530\u4e2d\", age: 30 }\njson_str = JSON.generate(data)\nputs json_str  # =&gt; {\"name\":\"\u7530\u4e2d\",\"age\":30}\n\n# \u6574\u5f62\u3057\u3066\u51fa\u529b\u3059\u308b\u5834\u5408\npretty_json = JSON.generate(data, pretty_print: true)<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>to_json<\/strong>: \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u76f4\u63a5JSON\u6587\u5b57\u5217\u306b\u5909\u63db<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u69d8\u3005\u306a\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u306e\u4f7f\u7528\u4f8b\nputs [1, 2, 3].to_json           # =&gt; [1,2,3]\nputs ({ a: 1, b: 2 }).to_json    # =&gt; {\"a\":1,\"b\":2}\nputs \"hello\".to_json             # =&gt; \"hello\"<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>JSON.dump \/ JSON.load<\/strong>: \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\/\u30c7\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092JSON\u3068\u3057\u3066\u30d5\u30a1\u30a4\u30eb\u306b\u4fdd\u5b58\nFile.open(\"data.json\", \"w\") do |f|\n  JSON.dump({ name: \"\u7530\u4e2d\", age: 30 }, f)\nend\n\n# \u30d5\u30a1\u30a4\u30eb\u304b\u3089JSON\u3092\u8aad\u307f\u8fbc\u307f\ndata = File.open(\"data.json\") do |f|\n  JSON.load(f)\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3044\u3053\u306a\u3059\u3053\u3068\u3067\u3001JSON\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u66f8\u304d\u3092\u52b9\u7387\u7684\u306b\u884c\u3046\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u307e\u305f\u3001\u5404\u30e1\u30bd\u30c3\u30c9\u306b\u306f\u69d8\u3005\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u7528\u610f\u3055\u308c\u3066\u304a\u308a\u3001\u7528\u9014\u306b\u5fdc\u3058\u3066\u7d30\u304b\u306a\u5236\u5fa1\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u6ce8\u610f\u70b9\u3068\u3057\u3066\u3001<code>JSON.load<\/code>\u306f\u4efb\u610f\u306eRuby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u5fa9\u5143\u3067\u304d\u308b\u305f\u3081\u3001\u4fe1\u983c\u3067\u304d\u306a\u3044\u30c7\u30fc\u30bf\u306b\u5bfe\u3057\u3066\u4f7f\u7528\u3059\u308b\u3068\u6f5c\u5728\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30ea\u30b9\u30af\u3068\u306a\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u305d\u306e\u3088\u3046\u306a\u5834\u5408\u306f<code>JSON.parse<\/code>\u306e\u4f7f\u7528\u3092\u63a8\u5968\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-3\">JSON\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f\u3068\u89e3\u6790\u624b\u9806<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">JSON.parse\u3067\u6587\u5b57\u5217\u304b\u3089Ruby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3078\u306e\u5909\u63db\u65b9\u6cd5<\/h3>\n\n\n\n<p>JSON.parse\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066JSON\u30c7\u30fc\u30bf\u3092\u89e3\u6790\u3059\u308b\u969b\u306e\u4e3b\u8981\u306a\u30dd\u30a4\u30f3\u30c8\u3068\u5b9f\u8df5\u7684\u306a\u4f7f\u7528\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u89e3\u6790\u30d1\u30bf\u30fc\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30b7\u30f3\u30d7\u30eb\u306aJSON\u306e\u89e3\u6790\njson_string = '{\"name\": \"\u5c71\u7530\u592a\u90ce\", \"age\": 25}'\nresult = JSON.parse(json_string)\nputs result[\"name\"]  # =&gt; \"\u5c71\u7530\u592a\u90ce\"\n\n# \u914d\u5217\u3092\u542b\u3080JSON\u306e\u89e3\u6790\njson_array = '[{\"id\": 1, \"name\": \"A\"}, {\"id\": 2, \"name\": \"B\"}]'\nresults = JSON.parse(json_array)\nresults.each { |item| puts item[\"name\"] }  # =&gt; A, B<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u4e3b\u8981\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u69d8\u3005\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u305f\u89e3\u6790\njson_string = '{\"name\": \"\u5c71\u7530\u592a\u90ce\", \"created_at\": \"2024-01-01\"}'\n\n# \u30aa\u30d7\u30b7\u30e7\u30f3\u4f8b\nresult = JSON.parse(json_string,\n  symbolize_names: true,     # \u30ad\u30fc\u3092\u30b7\u30f3\u30dc\u30eb\u306b\u5909\u63db\n  create_additions: false,   # \u30ab\u30b9\u30bf\u30e0\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\u3092\u7121\u52b9\u5316\n  max_nesting: 100          # \u30cd\u30b9\u30c8\u306e\u6700\u5927\u6df1\u3055\u3092\u5236\u9650\n)<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u5927\u304d\u306aJSON\u30d5\u30a1\u30a4\u30eb\u306e\u52b9\u7387\u7684\u306a\u8aad\u307f\u8fbc\u307f<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d5\u30a1\u30a4\u30eb\u304b\u3089\u76f4\u63a5\u8aad\u307f\u8fbc\u3080\u5834\u5408\nFile.open('large_data.json') do |file|\n  data = JSON.parse(file.read)\n  # \u30c7\u30fc\u30bf\u51e6\u7406\nend\n\n# \u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406\u306b\u3088\u308b\u5927\u898f\u6a21JSON\u306e\u89e3\u6790\nrequire 'oj'  # \u9ad8\u901f\u306aJSON\u30d1\u30fc\u30b5\u30fc\njson = File.read('large_data.json')\nOj.load_file('large_data.json', mode: :compat)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">\u30b7\u30f3\u30dc\u30eb\u30ad\u30fc\u3068\u6587\u5b57\u5217\u30ad\u30fc\u306e\u9055\u3044\u3068\u4f7f\u3044\u65b9<\/h3>\n\n\n\n<p>JSON\u30c7\u30fc\u30bf\u3092\u89e3\u6790\u3059\u308b\u969b\u3001\u30ad\u30fc\u3092\u6587\u5b57\u5217\u3068\u3057\u3066\u6271\u3046\u304b\u30b7\u30f3\u30dc\u30eb\u3068\u3057\u3066\u6271\u3046\u304b\u3067\u3001\u4f7f\u3044\u65b9\u3084\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u9055\u3044\u304c\u51fa\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ad\u30fc\u30bf\u30a4\u30d7\u306e\u9078\u629e\u57fa\u6e96<\/strong><\/li>\n<\/ol>\n\n\n<div id=\"id-037e263a-cf7c-402e-bc1d-202f44220480\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7279\u5fb4<\/th><th>\u6587\u5b57\u5217\u30ad\u30fc<\/th><th>\u30b7\u30f3\u30dc\u30eb\u30ad\u30fc<\/th><\/tr><\/thead><tbody><tr><td>\u30e1\u30e2\u30ea\u52b9\u7387<\/td><td>\u5404\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3067\u5225\u30aa\u30d6\u30b8\u30a7\u30af\u30c8<\/td><td>\u540c\u3058\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u518d\u5229\u7528<\/td><\/tr><tr><td>\u4f7f\u7528\u4f8b<\/td><td>\u5916\u90e8API\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\u51e6\u7406<\/td><td>Rails\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u51e6\u7406<\/td><\/tr><tr><td>\u30a2\u30af\u30bb\u30b9\u65b9\u6cd5<\/td><td>data[\u201cname\u201d]<\/td><td>data[:name]<\/td><\/tr><tr><td>GC\u5bfe\u8c61<\/td><td>\u5bfe\u8c61\u3068\u306a\u308b<\/td><td>\u5bfe\u8c61\u3068\u306a\u3089\u306a\u3044<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u5b9f\u88c5\u4f8b\u306b\u3088\u308b\u6bd4\u8f03<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u6587\u5b57\u5217\u30ad\u30fc\u306e\u5834\u5408\njson_str = '{\"name\": \"\u7530\u4e2d\", \"age\": 30}'\ndata = JSON.parse(json_str)\nputs data[\"name\"]    # =&gt; \"\u7530\u4e2d\"\nputs data.keys       # =&gt; [\"name\", \"age\"]\n\n# \u30b7\u30f3\u30dc\u30eb\u30ad\u30fc\u306e\u5834\u5408\ndata = JSON.parse(json_str, symbolize_names: true)\nputs data[:name]     # =&gt; \"\u7530\u4e2d\"\nputs data.keys       # =&gt; [:name, :age]<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306e\u8003\u616e\u70b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'benchmark'\n\njson_str = '{\"name\": \"\u7530\u4e2d\", \"age\": 30}'\n\nBenchmark.bm do |x|\n  x.report(\"\u6587\u5b57\u5217\u30ad\u30fc:\") { \n    1000.times { JSON.parse(json_str) }\n  }\n\n  x.report(\"\u30b7\u30f3\u30dc\u30eb\u30ad\u30fc:\") { \n    1000.times { JSON.parse(json_str, symbolize_names: true) }\n  }\nend<\/pre>\n\n\n\n<p>\u30b7\u30f3\u30dc\u30eb\u30ad\u30fc\u3092\u4f7f\u7528\u3059\u308b\u969b\u306e\u6ce8\u610f\u70b9\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b7\u30f3\u30dc\u30eb\u306fGC\u306e\u5bfe\u8c61\u3068\u306a\u3089\u306a\u3044\u305f\u3081\u3001\u5927\u91cf\u306e\u4e00\u610f\u306e\u30ad\u30fc\u3092\u6301\u3064JSON\u3092\u51e6\u7406\u3059\u308b\u5834\u5408\u306f\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306b\u6ce8\u610f<\/li>\n\n\n\n<li>\u52d5\u7684\u306b\u751f\u6210\u3055\u308c\u308b\u30ad\u30fc\u306b\u306f\u6587\u5b57\u5217\u30ad\u30fc\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3092\u63a8\u5968<\/li>\n\n\n\n<li>\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3084\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u898f\u7d04\u306b\u5f93\u3046\u3053\u3068\u304c\u671b\u307e\u3057\u3044<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-6\">Ruby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304b\u3089JSON\u3078\u306e\u5909\u63db\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">to_json\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3063\u305f\u57fa\u672c\u7684\u306a\u5909\u63db\u65b9\u6cd5<\/h3>\n\n\n\n<p>Ruby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u7c21\u5358\u306bJSON\u5f62\u5f0f\u306b\u5909\u63db\u3067\u304d\u308b<code>to_json<\/code>\u30e1\u30bd\u30c3\u30c9\u306b\u3064\u3044\u3066\u3001\u57fa\u672c\u304b\u3089\u5fdc\u7528\u307e\u3067\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30c7\u30fc\u30bf\u578b\u306e\u5909\u63db<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u69d8\u3005\u306aRuby\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u5909\u63db\u4f8b\nputs 42.to_json                    # =&gt; 42\nputs \"Hello\".to_json              # =&gt; \"Hello\"\nputs [1, 2, 3].to_json            # =&gt; [1,2,3]\nputs ({name: \"\u592a\u90ce\"}).to_json      # =&gt; {\"name\":\"\u592a\u90ce\"}\nputs true.to_json                 # =&gt; true\nputs nil.to_json                  # =&gt; null\n\n# \u8907\u96d1\u306a\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u5909\u63db\ncomplex_data = {\n  user: {\n    name: \"\u5c71\u7530\u592a\u90ce\",\n    age: 30,\n    hobbies: [\"\u8aad\u66f8\", \"\u65c5\u884c\"],\n    active: true\n  }\n}\nputs complex_data.to_json<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30af\u30e9\u30b9\u3067\u306e\u4f7f\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class User\n  def initialize(name, age)\n    @name = name\n    @age = age\n  end\n\n  # \u30ab\u30b9\u30bf\u30e0to_json\u5b9f\u88c5\n  def to_json(*args)\n    {\n      name: @name,\n      age: @age\n    }.to_json(*args)\n  end\nend\n\nuser = User.new(\"\u5c71\u7530\u592a\u90ce\", 30)\nputs user.to_json  # =&gt; {\"name\":\"\u5c71\u7530\u592a\u90ce\",\"age\":30}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-8\">JSON.generate\u3092\u4f7f\u3063\u305f\u67d4\u8edf\u306a\u51fa\u529b\u5236\u5fa1<\/h3>\n\n\n\n<p><code>JSON.generate<\/code>\u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u3088\u308a\u7d30\u304b\u3044\u51fa\u529b\u5236\u5fa1\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u4f7f\u7528\u65b9\u6cd5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">data = { name: \"\u5c71\u7530\u592a\u90ce\", age: 30 }\n\n# \u57fa\u672c\u7684\u306a\u5909\u63db\nputs JSON.generate(data)  # =&gt; {\"name\":\"\u5c71\u7530\u592a\u90ce\",\"age\":30}\n\n# \u6574\u5f62\u51fa\u529b\nputs JSON.generate(data, pretty_print: true)\n# {\n#   \"name\": \"\u5c71\u7530\u592a\u90ce\",\n#   \"age\": 30\n# }<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u9ad8\u5ea6\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">data = { name: \"\u5c71\u7530\u592a\u90ce\", created_at: Time.now }\n\n# \u69d8\u3005\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u305f\u751f\u6210\njson = JSON.generate(data, {\n  pretty_print: true,        # \u6574\u5f62\u51fa\u529b\n  indent: \"\\t\",             # \u30a4\u30f3\u30c7\u30f3\u30c8\u306b\u30bf\u30d6\u3092\u4f7f\u7528\n  space: \" \",               # \u30ad\u30fc\u3068\u5024\u306e\u9593\u306e\u30b9\u30da\u30fc\u30b9\n  max_nesting: 50,          # \u30cd\u30b9\u30c8\u306e\u6700\u5927\u6df1\u3055\n  allow_nan: true           # IEEE 754\u6d6e\u52d5\u5c0f\u6570\u70b9\u6570\u3092\u8a31\u53ef\n})<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'benchmark'\nrequire 'oj'  # \u9ad8\u901f\u306aJSON\u30b8\u30a7\u30cd\u30ec\u30fc\u30bf\u30fc\n\nlarge_data = (1..1000).map { |i| { id: i, name: \"Item #{i}\" } }\n\nBenchmark.bm do |x|\n  x.report(\"JSON.generate:\") {\n    JSON.generate(large_data)\n  }\n\n  x.report(\"to_json:\") {\n    large_data.to_json\n  }\n\n  x.report(\"Oj.dump:\") {\n    Oj.dump(large_data)  # \u6700\u3082\u9ad8\u901f\n  }\nend<\/pre>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li><strong>\u5909\u63db\u6642\u306e\u6ce8\u610f\u70b9\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u65e5\u6642\u30c7\u30fc\u30bf\u306e\u51e6\u7406<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Time\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306eJSON\u5909\u63db\ntime_data = {\n  created_at: Time.now,\n  updated_at: DateTime.now\n}\n\n# ISO 8601\u5f62\u5f0f\u3067\u306e\u51fa\u529b\njson = JSON.generate(time_data) do |obj|\n  if obj.is_a?(Time) || obj.is_a?(DateTime)\n    obj.iso8601\n  else\n    obj\n  end\nend<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5faa\u74b0\u53c2\u7167\u306e\u51e6\u7406<\/strong><\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u5faa\u74b0\u53c2\u7167\u3092\u542b\u3080\u30c7\u30fc\u30bf\u69cb\u9020\nclass Node\n  attr_accessor :name, :parent, :children\n\n  def to_json(*args)\n    {\n      name: @name,\n      children: @children\n    }.to_json(*args)  # parent\u306f\u9664\u5916\u3057\u3066\u5faa\u74b0\u53c2\u7167\u3092\u56de\u907f\n  end\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5909\u63db\u30c6\u30af\u30cb\u30c3\u30af\u3092\u9069\u5207\u306b\u4f7f\u3044\u5206\u3051\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u3067\u4fe1\u983c\u6027\u306e\u9ad8\u3044JSON\u751f\u6210\u51e6\u7406\u3092\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-9\">\u5b9f\u8df5\u7684\u306aJSON\u30c7\u30fc\u30bf\u51e6\u7406\u30d1\u30bf\u30fc\u30f3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u30cd\u30b9\u30c8\u3055\u308c\u305fJSON\u69cb\u9020\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u8907\u96d1\u306a\u30cd\u30b9\u30c8\u69cb\u9020\u3092\u6301\u3064JSON\u30c7\u30fc\u30bf\u3092\u52b9\u7387\u7684\u306b\u51e6\u7406\u3059\u308b\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6df1\u3044\u30cd\u30b9\u30c8\u69cb\u9020\u306e\u5b89\u5168\u306a\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u6df1\u3044\u30cd\u30b9\u30c8\u69cb\u9020\u3092\u6301\u3064JSON\u30c7\u30fc\u30bf\ncomplex_json = &lt;&lt;-JSON\n{\n  \"company\": {\n    \"department\": {\n      \"team\": {\n        \"members\": [\n          {\"name\": \"\u5c71\u7530\", \"role\": \"\u30ea\u30fc\u30c0\u30fc\"},\n          {\"name\": \"\u7530\u4e2d\", \"role\": \"\u30e1\u30f3\u30d0\u30fc\"}\n        ]\n      }\n    }\n  }\n}\nJSON\n\n# \u5b89\u5168\u306a\u30a2\u30af\u30bb\u30b9\u65b9\u6cd5\ndata = JSON.parse(complex_json)\nmembers = data.dig(\"company\", \"department\", \"team\", \"members\")\nputs members&amp;.first&amp;.[](\"name\")  # =&gt; \"\u5c71\u7530\"\n\n# \u30ab\u30b9\u30bf\u30e0\u30e1\u30bd\u30c3\u30c9\u306b\u3088\u308b\u6df1\u3044\u30cd\u30b9\u30c8\u306e\u51e6\u7406\ndef safe_navigate(hash, *keys)\n  keys.reduce(hash) { |h, key| h &amp;&amp; h[key] }\nend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u518d\u5e30\u7684\u306a\u51e6\u7406\u306e\u30d1\u30bf\u30fc\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30cd\u30b9\u30c8\u3055\u308c\u305f\u69cb\u9020\u3092\u518d\u5e30\u7684\u306b\u51e6\u7406\u3059\u308b\ndef process_nested_json(data)\n  case data\n  when Hash\n    data.transform_values { |v| process_nested_json(v) }\n  when Array\n    data.map { |item| process_nested_json(item) }\n  else\n    data\n  end\nend\n\n# \u4f7f\u7528\u4f8b\uff1a\u5168\u3066\u306e\u6587\u5b57\u5217\u3092\u5927\u6587\u5b57\u306b\u5909\u63db\ndef upcase_strings(data)\n  process_nested_json(data) do |value|\n    value.is_a?(String) ? value.upcase : value\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">\u914d\u5217\u8981\u7d20\u3092\u542b\u3080JSON\u306e\u64cd\u4f5c\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<p>\u914d\u5217\u3092\u542b\u3080JSON\u30c7\u30fc\u30bf\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406\u65b9\u6cd5\u3068\u5b9f\u8df5\u7684\u306a\u30d1\u30bf\u30fc\u30f3\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u914d\u5217\u30c7\u30fc\u30bf\u306e\u5909\u63db\u3068\u96c6\u8a08<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u914d\u5217\u30c7\u30fc\u30bf\u306e\u51e6\u7406\u4f8b\njson_array = &lt;&lt;-JSON\n[\n  {\"product\": \"A\", \"sales\": 100, \"date\": \"2024-01-01\"},\n  {\"product\": \"B\", \"sales\": 200, \"date\": \"2024-01-01\"},\n  {\"product\": \"A\", \"sales\": 150, \"date\": \"2024-01-02\"}\n]\nJSON\n\ndata = JSON.parse(json_array)\n\n# \u30b0\u30eb\u30fc\u30d7\u5316\u3068\u96c6\u8a08\nsummary = data.group_by { |item| item[\"product\"] }\n            .transform_values { |items| items.sum { |i| i[\"sales\"] } }\n\n# \u65e5\u4ed8\u3054\u3068\u306e\u96c6\u8a08\ndaily_sales = data.group_by { |item| item[\"date\"] }\n                 .transform_values { |items| items.sum { |i| i[\"sales\"] } }<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u914d\u5217\u306e\u52b9\u7387\u7684\u306a\u64cd\u4f5c<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u5927\u898f\u6a21\u306a\u914d\u5217\u30c7\u30fc\u30bf\u306e\u52b9\u7387\u7684\u306a\u51e6\u7406\nrequire 'json'\nrequire 'parallel'  # \u4e26\u5217\u51e6\u7406\u7528\n\n# \u4e26\u5217\u51e6\u7406\u306b\u3088\u308b\u5927\u898f\u6a21\u914d\u5217\u306e\u51e6\u7406\ndef process_large_array(json_array)\n  data = JSON.parse(json_array)\n\n  Parallel.map(data, in_threads: 4) do |item|\n    # \u91cd\u3044\u51e6\u7406\u3092\u3053\u3053\u3067\u5b9f\u884c\n    process_item(item)\n  end\nend\n\n# \u30d0\u30c3\u30c1\u51e6\u7406\u306b\u3088\u308b\u5927\u898f\u6a21\u914d\u5217\u306e\u51e6\u7406\ndef batch_process(json_array, batch_size = 1000)\n  data = JSON.parse(json_array)\n\n  data.each_slice(batch_size) do |batch|\n    results = batch.map { |item| process_item(item) }\n    save_results(results)  # \u30d0\u30c3\u30c1\u3054\u3068\u306e\u7d50\u679c\u3092\u4fdd\u5b58\n  end\nend<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u5b9f\u8df5\u7684\u306a\u914d\u5217\u64cd\u4f5c\u30d1\u30bf\u30fc\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u914d\u5217\u30c7\u30fc\u30bf\u306e\u691c\u8a3c\u3068\u5909\u63db\nclass ArrayProcessor\n  def initialize(json_array)\n    @data = JSON.parse(json_array)\n  end\n\n  # \u5fc5\u9808\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u691c\u8a3c\n  def validate_required_fields(*fields)\n    @data.all? do |item|\n      fields.all? { |field| item.key?(field) &amp;&amp; !item[field].nil? }\n    end\n  end\n\n  # \u7279\u5b9a\u6761\u4ef6\u3067\u306e\u7d5e\u308a\u8fbc\u307f\n  def filter_by_condition(&amp;block)\n    @data.select(&amp;block)\n  end\n\n  # \u69cb\u9020\u306e\u5909\u63db\n  def transform_structure\n    @data.map do |item|\n      {\n        id: item[\"id\"],\n        details: item.except(\"id\")\n      }\n    end\n  end\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d1\u30bf\u30fc\u30f3\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u8907\u96d1\u306aJSON\u30c7\u30fc\u30bf\u69cb\u9020\u3082\u52b9\u7387\u7684\u306b\u51e6\u7406\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3068\u30c7\u30d0\u30c3\u30b0\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">JSON::ParserError\u306e\u6b63\u3057\u3044\u5bfe\u51e6\u65b9\u6cd5<\/h3>\n\n\n\n<p>JSON\u30c7\u30fc\u30bf\u3092\u6271\u3046\u969b\u306b\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u69d8\u3005\u306a\u30a8\u30e9\u30fc\u3068\u305d\u306e\u9069\u5207\u306a\u51e6\u7406\u65b9\u6cd5\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">def safe_parse_json(json_string)\n  begin\n    JSON.parse(json_string)\n  rescue JSON::ParserError =&gt; e\n    # \u30a8\u30e9\u30fc\u30ed\u30b0\u306e\u8a18\u9332\n    Rails.logger.error(\"JSON\u30d1\u30fc\u30b9\u30a8\u30e9\u30fc: #{e.message}\")\n    # \u30a8\u30e9\u30fc\u306e\u8a73\u7d30\u60c5\u5831\u3092\u542b\u3080\u30cf\u30c3\u30b7\u30e5\u3092\u8fd4\u3059\n    { error: 'Invalid JSON format', details: e.message }\n  rescue StandardError =&gt; e\n    # \u305d\u306e\u4ed6\u306e\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u306e\u51e6\u7406\n    Rails.logger.error(\"\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc: #{e.message}\")\n    { error: 'Unknown error occurred', details: e.message }\n  end\nend\n\n# \u4f7f\u7528\u4f8b\nresult = safe_parse_json('{\"name\": \"\u7530\u4e2d\", age: 30}')  # \u7121\u52b9\u306aJSON\nputs result  # =&gt; {:error=&gt;\"Invalid JSON format\", :details=&gt;\"...\"}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30a8\u30e9\u30fc\u30af\u30e9\u30b9\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module JSONProcessor\n  class ValidationError &lt; StandardError; end\n  class InvalidFormatError &lt; StandardError; end\n\n  def self.parse_with_validation(json_string, required_fields: [])\n    begin\n      data = JSON.parse(json_string)\n\n      # \u5fc5\u9808\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u691c\u8a3c\n      missing_fields = required_fields - data.keys\n      unless missing_fields.empty?\n        raise ValidationError, \"\u5fc5\u9808\u30d5\u30a3\u30fc\u30eb\u30c9\u304c\u3042\u308a\u307e\u305b\u3093: #{missing_fields.join(', ')}\"\n      end\n\n      data\n    rescue JSON::ParserError =&gt; e\n      raise InvalidFormatError, \"JSON\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u304c\u4e0d\u6b63\u3067\u3059: #{e.message}\"\n    end\n  end\nend\n\n# \u4f7f\u7528\u4f8b\nbegin\n  data = JSONProcessor.parse_with_validation(\n    '{\"name\": \"\u7530\u4e2d\"}',\n    required_fields: ['name', 'age']\n  )\nrescue JSONProcessor::ValidationError =&gt; e\n  puts \"\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc: #{e.message}\"\nrescue JSONProcessor::InvalidFormatError =&gt; e\n  puts \"\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u30a8\u30e9\u30fc: #{e.message}\"\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3068\u30b5\u30cb\u30bf\u30a4\u30ba\u306e\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>JSON\u30c7\u30fc\u30bf\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u3068\u30b5\u30cb\u30bf\u30a4\u30ba\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b89\u5168\u6027\u3068\u4fe1\u983c\u6027\u3092\u78ba\u4fdd\u3059\u308b\u4e0a\u3067\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5165\u529b\u30c7\u30fc\u30bf\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class JSONValidator\n  def self.validate_structure(data, schema)\n    case schema\n    when Hash\n      return false unless data.is_a?(Hash)\n      schema.all? { |key, type| validate_field(data[key], type) }\n    when Array\n      return false unless data.is_a?(Array)\n      data.all? { |item| validate_structure(item, schema.first) }\n    else\n      data.is_a?(schema)\n    end\n  end\n\n  private\n\n  def self.validate_field(value, expected_type)\n    case expected_type\n    when Class\n      value.is_a?(expected_type)\n    when Array, Hash\n      validate_structure(value, expected_type)\n    end\n  end\nend\n\n# \u4f7f\u7528\u4f8b\nschema = {\n  name: String,\n  age: Integer,\n  hobbies: [String],\n  address: {\n    city: String,\n    zip: String\n  }\n}\n\njson_data = JSON.parse('{\"name\":\"\u7530\u4e2d\", \"age\":30, \"hobbies\":[\"\u8aad\u66f8\"], \"address\":{\"city\":\"\u6771\u4eac\", \"zip\":\"100-0001\"}}')\nis_valid = JSONValidator.validate_structure(json_data, schema)<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u306e\u30b5\u30cb\u30bf\u30a4\u30ba\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class JSONSanitizer\n  def self.sanitize(data)\n    case data\n    when Hash\n      data.transform_values { |v| sanitize(v) }\n    when Array\n      data.map { |item| sanitize(item) }\n    when String\n      sanitize_string(data)\n    else\n      data\n    end\n  end\n\n  private\n\n  def self.sanitize_string(str)\n    # XSS\u5bfe\u7b56\n    str.gsub(\/&lt;[^&gt;]*&gt;\/, '')\n       .gsub(\/javascript:\/i, '')\n       .strip\n  end\nend\n\n# \u4f7f\u7528\u4f8b\ndirty_json = '{\"name\": \"&lt;script&gt;alert(1)&lt;\/script&gt;\", \"description\": \"javascript:alert(2)\"}'\ndata = JSON.parse(dirty_json)\nclean_data = JSONSanitizer.sanitize(data)<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u306e\u305f\u3081\u306e\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u95a2\u6570<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module JSONDebugger\n  def self.analyze_json(json_string)\n    begin\n      # JSON\u306e\u69cb\u9020\u89e3\u6790\n      data = JSON.parse(json_string)\n\n      {\n        valid: true,\n        structure: analyze_structure(data),\n        size: json_string.bytesize,\n        depth: calculate_depth(data)\n      }\n    rescue JSON::ParserError =&gt; e\n      {\n        valid: false,\n        error: e.message,\n        position: e.pos,\n        snippet: json_string[([e.pos - 20, 0].max)..(e.pos + 20)]\n      }\n    end\n  end\n\n  private\n\n  def self.analyze_structure(data, depth = 0)\n    case data\n    when Hash\n      \"Hash with #{data.keys.size} keys at depth #{depth}\"\n    when Array\n      \"Array with #{data.size} items at depth #{depth}\"\n    else\n      \"#{data.class} at depth #{depth}\"\n    end\n  end\n\n  def self.calculate_depth(data, current_depth = 0)\n    case data\n    when Hash\n      data.values.map { |v| calculate_depth(v, current_depth + 1) }.max || current_depth\n    when Array\n      data.map { |v| calculate_depth(v, current_depth + 1) }.max || current_depth\n    else\n      current_depth\n    end\n  end\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u5805\u7262\u306aJSON\u30c7\u30fc\u30bf\u51e6\u7406\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-15\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30c6\u30af\u30cb\u30c3\u30af<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-16\">\u5927\u898f\u6a21\u306aJSON\u30c7\u30fc\u30bf\u51e6\u7406\u306e\u52b9\u7387\u5316\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u5927\u898f\u6a21\u306aJSON\u30c7\u30fc\u30bf\u3092\u52b9\u7387\u7684\u306b\u51e6\u7406\u3059\u308b\u305f\u3081\u306e\u69d8\u3005\u306a\u30c6\u30af\u30cb\u30c3\u30af\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'oj'  # \u9ad8\u901f\u306aJSON\u30d1\u30fc\u30b5\u30fc\nrequire 'benchmark'\n\n# \u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u30d1\u30fc\u30b5\u30fc\u306e\u5b9f\u88c5\nclass StreamParser &lt; Oj::Saj\n  def initialize\n    @results = []\n  end\n\n  def hash_start\n    # \u30cf\u30c3\u30b7\u30e5\u306e\u958b\u59cb\u6642\u306e\u51e6\u7406\n  end\n\n  def hash_end\n    # \u30cf\u30c3\u30b7\u30e5\u306e\u7d42\u4e86\u6642\u306e\u51e6\u7406\n  end\n\n  def array_start\n    # \u914d\u5217\u306e\u958b\u59cb\u6642\u306e\u51e6\u7406\n  end\n\n  def array_end\n    # \u914d\u5217\u306e\u7d42\u4e86\u6642\u306e\u51e6\u7406\n  end\n\n  def add_value(value)\n    @results &lt;&lt; value if value.is_a?(Hash)\n  end\n\n  attr_reader :results\nend\n\n# \u4f7f\u7528\u4f8b\nparser = StreamParser.new\nOj.load_file('large_data.json', handler: parser)<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class BatchProcessor\n  def initialize(batch_size = 1000)\n    @batch_size = batch_size\n  end\n\n  def process_large_json(file_path)\n    File.open(file_path) do |file|\n      parser = Oj::Parser.new(:compat)\n      batch = []\n\n      parser.parse_file(file) do |record|\n        batch &lt;&lt; record\n        if batch.size &gt;= @batch_size\n          process_batch(batch)\n          batch.clear\n        end\n      end\n\n      process_batch(batch) unless batch.empty?\n    end\n  end\n\n  private\n\n  def process_batch(batch)\n    # \u30d0\u30c3\u30c1\u51e6\u7406\u306e\u5b9f\u88c5\n    batch.each do |record|\n      # \u30ec\u30b3\u30fc\u30c9\u306e\u51e6\u7406\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u8003\u616e\u3057\u305f\u30b9\u30c8\u30ea\u30fc\u30df\u30f3\u30b0\u51e6\u7406<\/h3>\n\n\n\n<p>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u306a\u304c\u3089\u5927\u898f\u6a21\u306aJSON\u30c7\u30fc\u30bf\u3092\u51e6\u7406\u3059\u308b\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u52b9\u7387\u306e\u826f\u3044\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'json\/stream'\n\nclass MemoryEfficientParser\n  def parse_large_file(file_path)\n    parser = JSON::Stream::Parser.new do |records|\n      records.array_start do\n        # \u914d\u5217\u306e\u958b\u59cb\u6642\u306e\u51e6\u7406\n      end\n\n      records.array_end do\n        # \u914d\u5217\u306e\u7d42\u4e86\u6642\u306e\u51e6\u7406\n      end\n\n      records.object_start do\n        # \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u958b\u59cb\u6642\u306e\u51e6\u7406\n      end\n\n      records.object_end do\n        # \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u7d42\u4e86\u6642\u306e\u51e6\u7406\n      end\n\n      records.value do |value|\n        process_value(value)\n      end\n    end\n\n    File.open(file_path) do |file|\n      while chunk = file.read(8192)\n        parser &lt;&lt; chunk\n      end\n    end\n  end\n\n  private\n\n  def process_value(value)\n    # \u5024\u306e\u51e6\u7406\n  end\nend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6e2c\u5b9a\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'memory_profiler'\n\nclass PerformanceMonitor\n  def self.measure_memory_usage\n    MemoryProfiler.report do\n      yield\n    end\n  end\n\n  def self.measure_execution_time\n    start_time = Time.now\n    result = yield\n    end_time = Time.now\n\n    {\n      result: result,\n      execution_time: end_time - start_time\n    }\n  end\nend\n\n# \u4f7f\u7528\u4f8b\nPerformanceMonitor.measure_memory_usage do\n  # \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u3092\u6e2c\u5b9a\u3057\u305f\u3044\u51e6\u7406\n  large_json = File.read('large_data.json')\n  JSON.parse(large_json)\nend\n\nresult = PerformanceMonitor.measure_execution_time do\n  # \u5b9f\u884c\u6642\u9593\u3092\u6e2c\u5b9a\u3057\u305f\u3044\u51e6\u7406\n  process_json_data(large_json)\nend<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">require 'lru_redux'\n\nclass JSONCache\n  def initialize(max_size = 1000)\n    @cache = LruRedux::Cache.new(max_size)\n  end\n\n  def fetch(key)\n    @cache.fetch(key) do\n      yield\n    end\n  end\n\n  def clear\n    @cache.clear\n  end\nend\n\n# \u4f7f\u7528\u4f8b\njson_cache = JSONCache.new\nresult = json_cache.fetch('key') do\n  JSON.parse(large_json_string)\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u30c6\u30af\u30cb\u30c3\u30af\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5927\u898f\u6a21\u306aJSON\u30c7\u30fc\u30bf\u51e6\u7406\u3067\u3082\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u52b9\u7387\u6027\u3092\u78ba\u4fdd\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-18\">\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8003\u616e\u4e8b\u9805\u3068\u5bfe\u7b56<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">JSON\u30c7\u30fc\u30bf\u51e6\u7406\u306b\u304a\u3051\u308b\u4e00\u822c\u7684\u306a\u8106\u5f31\u6027<\/h3>\n\n\n\n<p>JSON\u30c7\u30fc\u30bf\u3092\u51e6\u7406\u3059\u308b\u969b\u306b\u6ce8\u610f\u3059\u3079\u304d\u4e3b\u306a\u8106\u5f31\u6027\u3068\u305d\u306e\u5bfe\u7b56\u306b\u3064\u3044\u3066\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>JSON\u6ce8\u5165\u653b\u6483\u3078\u306e\u5bfe\u7b56<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class JSONSecurityHandler\n  def self.safe_parse(input)\n    # \u5165\u529b\u306e\u691c\u8a3c\n    raise 'Invalid input' unless input.is_a?(String)\n\n    # \u5b89\u5168\u306a\u30d1\u30fc\u30b9\u8a2d\u5b9a\n    JSON.parse(input, \n      max_nesting: 20,          # \u6df1\u3059\u304e\u308b\u30cd\u30b9\u30c8\u3092\u9632\u3050\n      create_additions: false,   # \u4efb\u610f\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u751f\u6210\u3092\u9632\u3050\n      symbolize_names: false    # \u610f\u56f3\u3057\u306a\u3044\u30b7\u30f3\u30dc\u30eb\u751f\u6210\u3092\u9632\u3050\n    )\n  rescue JSON::ParserError =&gt; e\n    Rails.logger.error(\"JSON\u30d1\u30fc\u30b9\u30a8\u30e9\u30fc: #{e.message}\")\n    nil\n  end\nend\n\n# \u4f7f\u7528\u4f8b\nsafe_data = JSONSecurityHandler.safe_parse('{\"user\": \"\u7530\u4e2d\"}')<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u5165\u529b\u5024\u306e\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module JSONValidator\n  class ValidationError &lt; StandardError; end\n\n  def self.validate_input(json_data, schema)\n    # \u30b9\u30ad\u30fc\u30de\u306b\u57fa\u3065\u304f\u691c\u8a3c\n    validate_structure(json_data, schema)\n    validate_data_types(json_data, schema)\n    validate_value_ranges(json_data, schema)\n    true\n  rescue ValidationError =&gt; e\n    Rails.logger.error(\"\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc: #{e.message}\")\n    false\n  end\n\n  private\n\n  def self.validate_structure(data, schema)\n    schema.each do |key, rules|\n      unless data.key?(key)\n        raise ValidationError, \"\u5fc5\u9808\u30ad\u30fc\u304c\u5b58\u5728\u3057\u307e\u305b\u3093: #{key}\"\n      end\n    end\n  end\n\n  def self.validate_data_types(data, schema)\n    schema.each do |key, rules|\n      expected_type = rules[:type]\n      actual_value = data[key]\n\n      unless actual_value.is_a?(expected_type)\n        raise ValidationError, \"\u4e0d\u6b63\u306a\u30c7\u30fc\u30bf\u578b: #{key}\"\n      end\n    end\n  end\n\n  def self.validate_value_ranges(data, schema)\n    schema.each do |key, rules|\n      next unless rules[:range]\n\n      value = data[key]\n      range = rules[:range]\n\n      unless range.include?(value)\n        raise ValidationError, \"\u5024\u304c\u7bc4\u56f2\u5916\u3067\u3059: #{key}\"\n      end\n    end\n  end\nend<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u5b89\u5168\u306aJSON\u30d1\u30fc\u30b9\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u30bb\u30ad\u30e5\u30a2\u306aJSON\u30d1\u30fc\u30b9\u51e6\u7406\u3092\u5b9f\u88c5\u3059\u308b\u305f\u3081\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30a2\u306a\u30d1\u30fc\u30b5\u30fc\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class SecureJSONParser\n  MAX_STRING_LENGTH = 100_000\n  MAX_ARRAY_LENGTH = 1_000\n  MAX_NESTING_LEVEL = 20\n\n  def self.parse(json_string, options = {})\n    # \u6587\u5b57\u5217\u9577\u306e\u30c1\u30a7\u30c3\u30af\n    raise 'Input too long' if json_string.length &gt; MAX_STRING_LENGTH\n\n    # \u30d1\u30fc\u30b9\u524d\u306e\u30d7\u30ea\u30c1\u30a7\u30c3\u30af\n    pre_parse_check(json_string)\n\n    # \u5b89\u5168\u306a\u30d1\u30fc\u30b9\u51e6\u7406\n    parsed_data = JSON.parse(json_string,\n      max_nesting: MAX_NESTING_LEVEL,\n      create_additions: false\n    )\n\n    # \u30d1\u30fc\u30b9\u5f8c\u306e\u691c\u8a3c\n    post_parse_validate(parsed_data)\n\n    parsed_data\n  rescue StandardError =&gt; e\n    Rails.logger.error(\"\u30bb\u30ad\u30e5\u30a2\u30d1\u30fc\u30b9\u30a8\u30e9\u30fc: #{e.message}\")\n    raise\n  end\n\n  private\n\n  def self.pre_parse_check(json_string)\n    # \u5371\u967a\u306a\u6587\u5b57\u5217\u30d1\u30bf\u30fc\u30f3\u306e\u30c1\u30a7\u30c3\u30af\n    dangerous_patterns = [\n      \/\\u0000\/,          # NULL\u6587\u5b57\n      \/&lt;script&gt;\/i,       # \u30b9\u30af\u30ea\u30d7\u30c8\u30bf\u30b0\n      \/javascript:\/i,    # javascript\u30d7\u30ed\u30c8\u30b3\u30eb\n      \/data:\/i          # data\u30d7\u30ed\u30c8\u30b3\u30eb\n    ]\n\n    dangerous_patterns.each do |pattern|\n      raise 'Dangerous input detected' if json_string =~ pattern\n    end\n  end\n\n  def self.post_parse_validate(data)\n    case data\n    when Hash\n      data.each do |_, value|\n        post_parse_validate(value)\n      end\n    when Array\n      raise 'Array too large' if data.length &gt; MAX_ARRAY_LENGTH\n      data.each { |item| post_parse_validate(item) }\n    when String\n      raise 'String too long' if data.length &gt; MAX_STRING_LENGTH\n    end\n  end\nend<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30dd\u30ea\u30b7\u30fc\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">module JSONSecurityPolicy\n  class PolicyViolation &lt; StandardError; end\n\n  # \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30dd\u30ea\u30b7\u30fc\u306e\u5b9a\u7fa9\n  POLICIES = {\n    max_string_length: 100_000,\n    max_array_length: 1_000,\n    max_nesting_level: 20,\n    allowed_types: [String, Integer, Float, TrueClass, FalseClass, NilClass],\n    forbidden_keys: ['password', 'secret', 'token'],\n    required_keys: ['id', 'timestamp']\n  }\n\n  def self.enforce(json_data)\n    # \u30dd\u30ea\u30b7\u30fc\u30c1\u30a7\u30c3\u30af\u306e\u5b9f\u884c\n    check_data_types(json_data)\n    check_forbidden_keys(json_data)\n    check_required_keys(json_data)\n\n    true\n  rescue PolicyViolation =&gt; e\n    Rails.logger.error(\"\u30dd\u30ea\u30b7\u30fc\u9055\u53cd: #{e.message}\")\n    false\n  end\n\n  private\n\n  def self.check_data_types(data, depth = 0)\n    case data\n    when Hash\n      raise PolicyViolation, 'Maximum nesting level exceeded' if depth &gt; POLICIES[:max_nesting_level]\n      data.each { |_, v| check_data_types(v, depth + 1) }\n    when Array\n      raise PolicyViolation, 'Array too large' if data.length &gt; POLICIES[:max_array_length]\n      data.each { |item| check_data_types(item, depth + 1) }\n    else\n      unless POLICIES[:allowed_types].any? { |type| data.is_a?(type) }\n        raise PolicyViolation, \"Disallowed type: #{data.class}\"\n      end\n    end\n  end\n\n  def self.check_forbidden_keys(data)\n    case data\n    when Hash\n      data.each do |key, value|\n        if POLICIES[:forbidden_keys].include?(key.to_s)\n          raise PolicyViolation, \"Forbidden key detected: #{key}\"\n        end\n        check_forbidden_keys(value)\n      end\n    when Array\n      data.each { |item| check_forbidden_keys(item) }\n    end\n  end\n\n  def self.check_required_keys(data)\n    return unless data.is_a?(Hash)\n\n    missing_keys = POLICIES[:required_keys] - data.keys.map(&amp;:to_s)\n    unless missing_keys.empty?\n      raise PolicyViolation, \"Missing required keys: #{missing_keys.join(', ')}\"\n    end\n  end\nend<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001JSON\u30c7\u30fc\u30bf\u51e6\u7406\u306b\u304a\u3051\u308b\u8106\u5f31\u6027\u3092\u6700\u5c0f\u9650\u306b\u6291\u3048\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u7279\u306b\u91cd\u8981\u306a\u306e\u306f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5165\u529b\u5024\u306e\u5fb9\u5e95\u7684\u306a\u691c\u8a3c<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30dd\u30ea\u30b7\u30fc\u306e\u4e00\u8cab\u3057\u305f\u9069\u7528<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ed\u30b0\u8a18\u9332\u3068\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u5b9a\u671f\u7684\u306a\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u67fb\u306e\u5b9f\u65bd<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":{"0":"post-1312","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ruby","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1312","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1312"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1312\/revisions"}],"predecessor-version":[{"id":1322,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/1312\/revisions\/1322"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1312"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1312"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}