• R/O
  • SSH
  • HTTPS

jsonic: コミット


コミットメタ情報

リビジョン1867 (tree)
日時2015-10-26 22:04:04
作者hizuno

ログメッセージ

(メッセージはありません)

変更サマリ

差分

--- trunk/jsonic-1.3/test/net/arnx/jsonic/web/RESTServletTest.java (revision 1866)
+++ trunk/jsonic-1.3/test/net/arnx/jsonic/web/RESTServletTest.java (revision 1867)
@@ -1,7 +1,7 @@
11 package net.arnx.jsonic.web;
22
33 import static javax.servlet.http.HttpServletResponse.*;
4-import static org.junit.Assert.assertEquals;
4+import static org.junit.Assert.*;
55
66 import java.io.BufferedReader;
77 import java.io.BufferedWriter;
@@ -17,9 +17,6 @@
1717 import java.util.List;
1818 import java.util.Map;
1919
20-import net.arnx.jsonic.JSON;
21-import net.arnx.jsonic.web.RESTServlet.RouteMapping;
22-
2320 import org.eclipse.jetty.server.Server;
2421 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
2522 import org.eclipse.jetty.webapp.WebAppContext;
@@ -29,11 +26,14 @@
2926 import org.seasar.framework.mock.servlet.MockHttpServletRequest;
3027 import org.seasar.framework.mock.servlet.MockServletContextImpl;
3128
29+import net.arnx.jsonic.JSON;
30+import net.arnx.jsonic.web.RESTServlet.RouteMapping;
31+
3232 @SuppressWarnings("unchecked")
3333 public class RESTServletTest {
34-
34+
3535 private static Server server;
36-
36+
3737 @BeforeClass
3838 public static void init() throws Exception {
3939 new File("sample/basic/WEB-INF/database.dat").delete();
@@ -40,49 +40,49 @@
4040 new File("sample/seasar2/WEB-INF/database.dat").delete();
4141 new File("sample/spring/WEB-INF/database.dat").delete();
4242 new File("sample/guice/WEB-INF/database.dat").delete();
43-
43+
4444 server = new Server(16001);
4545
4646 ContextHandlerCollection contexts = new ContextHandlerCollection();
47-
47+
4848 String[] systemClasses = new String[] {
4949 "org.apache.commons.",
5050 "org.aopalliance.",
5151 "ognl.",
5252 "javassist.",
53- "net.arnx.",
53+ "net.arnx.",
5454 "org.seasar.",
5555 "org.springframework.",
5656 "com.google.inject."
5757 };
58-
58+
5959 String[] serverClasses = new String[] {
6060 };
61-
61+
6262 WebAppContext basic = new WebAppContext("sample/basic", "/basic");
6363 basic.setSystemClasses(concat(basic.getSystemClasses(), systemClasses));
6464 basic.setServerClasses(concat(basic.getServerClasses(), serverClasses));
6565 contexts.addHandler(basic);
66-
66+
6767 WebAppContext seasar2 = new WebAppContext("sample/seasar2", "/seasar2");
6868 seasar2.setSystemClasses(concat(seasar2.getSystemClasses(), systemClasses));
6969 seasar2.setServerClasses(concat(seasar2.getServerClasses(), serverClasses));
7070 contexts.addHandler(seasar2);
71-
71+
7272 WebAppContext spring = new WebAppContext("sample/spring", "/spring");
7373 spring.setSystemClasses(concat(spring.getSystemClasses(), systemClasses));
7474 spring.setServerClasses(concat(spring.getServerClasses(), serverClasses));
7575 contexts.addHandler(spring);
76-
76+
7777 WebAppContext guice = new WebAppContext("sample/guice", "/guice");
7878 guice.setSystemClasses(concat(guice.getSystemClasses(), systemClasses));
7979 guice.setServerClasses(concat(guice.getServerClasses(), serverClasses));
8080 contexts.addHandler(guice);
81-
81+
8282 server.setHandler(contexts);
8383 server.start();
8484 }
85-
85+
8686 private static String[] concat(String[] a, String[] b) {
8787 String[] result = new String[a.length + b.length];
8888 System.arraycopy(a, 0, result, 0, a.length);
@@ -89,40 +89,40 @@
8989 System.arraycopy(b, 0, result, a.length, b.length);
9090 return result;
9191 }
92-
92+
9393 @AfterClass
9494 public static void destroy() throws Exception {
9595 server.stop();
9696 }
97-
97+
9898 @Test
9999 public void testREST() throws Exception {
100100 testREST("basic");
101101 }
102-
102+
103103 @Test
104104 public void testRESTwithSeasar2() throws Exception {
105105 testREST("seasar2");
106106 }
107-
107+
108108 @Test
109109 public void testRESTwithSpring() throws Exception {
110110 testREST("spring");
111111 }
112-
112+
113113 @Test
114114 public void testRESTwithGuice() throws Exception {
115115 testREST("guice");
116116 }
117-
117+
118118 public void testREST(String app) throws Exception {
119119 System.out.println("\n<<START testRest: " + app + ">>");
120-
120+
121121 String url = "http://localhost:16001/" + app + "/rest/memo";
122122 HttpURLConnection con = null;
123-
123+
124124 List<Map<String, Object>> content = null;
125-
125+
126126 // POST
127127 con = (HttpURLConnection)new URL(url + ".json").openConnection();
128128 con.setDoOutput(true);
@@ -132,7 +132,7 @@
132132 con.connect();
133133 assertEquals(SC_CREATED, con.getResponseCode());
134134 con.disconnect();
135-
135+
136136 // GET
137137 con = (HttpURLConnection)new URL(url + ".json").openConnection();
138138 con.setRequestMethod("GET");
@@ -140,7 +140,7 @@
140140 assertEquals(SC_OK, con.getResponseCode());
141141 content = (List<Map<String, Object>>)JSON.decode(read(con.getInputStream()));
142142 con.disconnect();
143-
143+
144144 // PUT
145145 con = (HttpURLConnection)new URL(url + "/" + content.get(0).get("id") + ".json").openConnection();
146146 con.setDoOutput(true);
@@ -150,7 +150,7 @@
150150 con.connect();
151151 assertEquals(SC_NO_CONTENT, con.getResponseCode());
152152 con.disconnect();
153-
153+
154154 // POST
155155 con = (HttpURLConnection)new URL(url + "/" + content.get(0).get("id") + ".json").openConnection();
156156 con.setDoOutput(true);
@@ -160,7 +160,7 @@
160160 con.connect();
161161 assertEquals(SC_METHOD_NOT_ALLOWED, con.getResponseCode());
162162 con.disconnect();
163-
163+
164164 // DELETE
165165 con = (HttpURLConnection)new URL(url + "/" + content.get(0).get("id") + ".json").openConnection();
166166 con.setRequestMethod("DELETE");
@@ -169,7 +169,7 @@
169169 con.connect();
170170 assertEquals(SC_NO_CONTENT, con.getResponseCode());
171171 con.disconnect();
172-
172+
173173 // DELETE
174174 con = (HttpURLConnection)new URL(url + "/" + content.get(0).get("id") + ".json").openConnection();
175175 con.setRequestMethod("DELETE");
@@ -178,7 +178,7 @@
178178 con.connect();
179179 assertEquals(SC_NOT_FOUND, con.getResponseCode());
180180 con.disconnect();
181-
181+
182182 // POST
183183 con = (HttpURLConnection)new URL(url + ".json").openConnection();
184184 con.setDoOutput(true);
@@ -188,7 +188,7 @@
188188 con.connect();
189189 assertEquals(SC_BAD_REQUEST, con.getResponseCode());
190190 con.disconnect();
191-
191+
192192 // POST
193193 con = (HttpURLConnection)new URL(url + ".json").openConnection();
194194 con.setDoOutput(true);
@@ -198,7 +198,7 @@
198198 con.connect();
199199 assertEquals(SC_BAD_REQUEST, con.getResponseCode());
200200 con.disconnect();
201-
201+
202202 // POST
203203 con = (HttpURLConnection)new URL(url + ".json").openConnection();
204204 con.setDoOutput(true);
@@ -208,7 +208,7 @@
208208 con.connect();
209209 assertEquals(SC_CREATED, con.getResponseCode());
210210 con.disconnect();
211-
211+
212212 // HEAD
213213 con = (HttpURLConnection)new URL(url + ".json").openConnection();
214214 con.setRequestMethod("HEAD");
@@ -215,7 +215,7 @@
215215 con.connect();
216216 assertEquals(SC_METHOD_NOT_ALLOWED, con.getResponseCode());
217217 con.disconnect();
218-
218+
219219 // OPTIONS
220220 con = (HttpURLConnection)new URL(url + ".json").openConnection();
221221 con.setRequestMethod("OPTIONS");
@@ -222,7 +222,7 @@
222222 con.connect();
223223 assertEquals(SC_METHOD_NOT_ALLOWED, con.getResponseCode());
224224 con.disconnect();
225-
225+
226226 // methods specified
227227 con = (HttpURLConnection)new URL(url + ".print.json").openConnection();
228228 con.setRequestMethod("GET");
@@ -229,15 +229,15 @@
229229 con.connect();
230230 assertEquals(SC_OK, con.getResponseCode());
231231 con.disconnect();
232-
232+
233233 con = (HttpURLConnection)new URL(url + ".exception.json").openConnection();
234234 con.setRequestMethod("GET");
235235 con.connect();
236236 assertEquals(SC_NOT_ACCEPTABLE, con.getResponseCode());
237- assertEquals(JSON.decode("{\"name\":\"MemoException\",\"message\":\"memo error!\",\"data\":{\"extensionProperty\":\"extension property\"}}"),
237+ assertEquals(JSON.decode("{\"name\":\"MemoException\",\"message\":\"memo error!\",\"data\":{\"extensionProperty\":\"extension property\",\"rename\":\"rename property\"}}"),
238238 JSON.decode(read(con.getErrorStream())));
239239 con.disconnect();
240-
240+
241241 // DUMMY
242242 url = "http://localhost:16001/" + app + "/rest/test";
243243 con = (HttpURLConnection)new URL(url + ".json").openConnection();
@@ -245,19 +245,19 @@
245245 con.connect();
246246 assertEquals(SC_NOT_FOUND, con.getResponseCode());
247247 con.disconnect();
248-
248+
249249 System.out.println("<<END testRest: " + app + ">>\n");
250250 }
251-
251+
252252 @Test
253253 public void testRESTWithMethod() throws Exception {
254254 System.out.println("\n<<START testRESTWithMethod>>");
255-
255+
256256 String url = "http://localhost:16001/basic/rest/memo.json";
257257 HttpURLConnection con = null;
258-
258+
259259 List<Map<String, Object>> content = null;
260-
260+
261261 // POST
262262 con = (HttpURLConnection)new URL(url + "?_method=POST").openConnection();
263263 con.setDoOutput(true);
@@ -267,7 +267,7 @@
267267 con.connect();
268268 assertEquals(SC_CREATED, con.getResponseCode());
269269 con.disconnect();
270-
270+
271271 // GET
272272 con = (HttpURLConnection)new URL(url + "?_method=GET").openConnection();
273273 con.setDoOutput(true);
@@ -277,7 +277,7 @@
277277 assertEquals(SC_OK, con.getResponseCode());
278278 content = (List<Map<String, Object>>)JSON.decode(read(con.getInputStream()));
279279 con.disconnect();
280-
280+
281281 // PUT
282282 con = (HttpURLConnection)new URL(url + "?_method=PUT").openConnection();
283283 con.setDoOutput(true);
@@ -287,7 +287,7 @@
287287 con.connect();
288288 assertEquals(SC_NO_CONTENT, con.getResponseCode());
289289 con.disconnect();
290-
290+
291291 // DELETE
292292 con = (HttpURLConnection)new URL(url + "?_method=DELETE").openConnection();
293293 con.setDoOutput(true);
@@ -297,7 +297,7 @@
297297 con.connect();
298298 assertEquals(SC_NO_CONTENT, con.getResponseCode());
299299 con.disconnect();
300-
300+
301301 // POST
302302 con = (HttpURLConnection)new URL(url + "?_method=POST").openConnection();
303303 con.setDoOutput(true);
@@ -307,7 +307,7 @@
307307 con.connect();
308308 assertEquals(SC_BAD_REQUEST, con.getResponseCode());
309309 con.disconnect();
310-
310+
311311 // POST
312312 con = (HttpURLConnection)new URL(url + "?_method=POST").openConnection();
313313 con.setDoOutput(true);
@@ -317,20 +317,20 @@
317317 con.connect();
318318 assertEquals(SC_BAD_REQUEST, con.getResponseCode());
319319 con.disconnect();
320-
320+
321321 System.out.println("\n<<END testRESTWithMethod>>");
322322 }
323-
323+
324324 @Test
325- public void testGetParameterMap() throws Exception {
325+ public void testGetParameterMap() throws Exception {
326326 MockServletContextImpl context = new MockServletContextImpl("/");
327327 MockHttpServletRequest request = null;
328-
328+
329329 request = context.createRequest("/?aaa=");
330330 request.setContentType("application/x-www-form-urlencoded");
331331 request.addParameter("aaa", "");
332332 assertEquals(JSON.decode("{aaa:''}"), getParameterMap(request));
333-
333+
334334 request = context.createRequest("/?aaa=aaa=bbb");
335335 request.setContentType("application/x-www-form-urlencoded");
336336 request.addParameter("aaa", "aaa=bbb");
@@ -347,28 +347,28 @@
347347 request.addParameter("", "");
348348 request.addParameter("", "");
349349 assertEquals(JSON.decode("{'':['','']}"),getParameterMap(request));
350-
350+
351351 request = context.createRequest("/");
352352 request.setContentType("application/x-www-form-urlencoded");
353353 assertEquals(JSON.decode("{}"), getParameterMap(request));
354-
354+
355355 request = context.createRequest("/?aaa.bbb=aaa");
356356 request.setContentType("application/x-www-form-urlencoded");
357357 request.addParameter("aaa.bbb", "aaa");
358358 assertEquals(JSON.decode("{aaa:{bbb:'aaa'}}"), getParameterMap(request));
359-
359+
360360 request = context.createRequest("/?" + URLEncoder.encode("諸行 無常", "UTF-8") + "=" + URLEncoder.encode("古今=東西", "UTF-8"));
361361 request.setContentType("application/x-www-form-urlencoded");
362362 request.setCharacterEncoding("UTF-8");
363363 request.addParameter("諸行 無常", "古今=東西");
364364 assertEquals(JSON.decode("{'諸行 無常':'古今=東西'}"), getParameterMap(request));
365-
365+
366366 request = context.createRequest("/?" + URLEncoder.encode("諸行 無常", "MS932") + "=" + URLEncoder.encode("古今=東西", "MS932"));
367367 request.setContentType("application/x-www-form-urlencoded");
368368 request.setCharacterEncoding("MS932");
369369 request.addParameter("諸行 無常", "古今=東西");
370370 assertEquals(JSON.decode("{'諸行 無常':'古今=東西'}"), getParameterMap(request));
371-
371+
372372 request = context.createRequest("/?aaa.bbb=aaa&aaa.bbb=bbb&aaa=aaa");
373373 request.setContentType("application/x-www-form-urlencoded");
374374 request.addParameter("aaa.bbb", "aaa");
@@ -375,7 +375,7 @@
375375 request.addParameter("aaa.bbb", "bbb");
376376 request.addParameter("aaa", "aaa");
377377 assertEquals(JSON.decode("{aaa:{bbb:['aaa', 'bbb'], null: 'aaa'}}"), getParameterMap(request));
378-
378+
379379 request = context.createRequest("/?aaa.bbb=aaa&aaa.bbb=bbb&aaa=aaa&aaa=bbb");
380380 request.setContentType("application/x-www-form-urlencoded");
381381 request.addParameter("aaa.bbb", "aaa");
@@ -383,31 +383,31 @@
383383 request.addParameter("aaa", "aaa");
384384 request.addParameter("bbb", "bbb");
385385 assertEquals(JSON.decode("{aaa:{bbb:['aaa', 'bbb'], null:'aaa'}, 'bbb':'bbb'}"), getParameterMap(request));
386-
386+
387387 request = context.createRequest("/?aaa.bbb=aaa&aaa.bbb=bbb");
388388 request.setContentType("application/x-www-form-urlencoded");
389389 request.addParameter("aaa.bbb", "aaa");
390390 request.addParameter("aaa.bbb", "bbb");
391391 assertEquals(JSON.decode("{aaa:{bbb:['aaa', 'bbb']}}"), getParameterMap(request));
392-
392+
393393 request = context.createRequest("/?aaa.bbb.=aaa&aaa.bbb.=bbb");
394394 request.setContentType("application/x-www-form-urlencoded");
395395 request.addParameter("aaa.bbb.", "aaa");
396396 request.addParameter("aaa.bbb.", "bbb");
397397 assertEquals(JSON.decode("{aaa:{bbb:{'':['aaa', 'bbb']}}}"), getParameterMap(request));
398-
398+
399399 request = context.createRequest("/?..=aaa&..=bbb");
400400 request.setContentType("application/x-www-form-urlencoded");
401401 request.addParameter("..", "aaa");
402402 request.addParameter("..", "bbb");
403403 assertEquals(JSON.decode("{'':{'':{'':['aaa', 'bbb']}}}"), getParameterMap(request));
404-
404+
405405 request = context.createRequest("/?aaa[bbb]=aaa&aaa[bbb]=bbb");
406406 request.setContentType("application/x-www-form-urlencoded");
407407 request.addParameter("aaa[bbb]", "aaa");
408408 request.addParameter("aaa[bbb]", "bbb");
409409 assertEquals(JSON.decode("{aaa:{bbb:['aaa', 'bbb']}}"), getParameterMap(request));
410-
410+
411411 request = context.createRequest("/?aaa[bbb]=aaa&aaa[bbb]=bbb");
412412 request.setContentType("application/x-www-form-urlencoded");
413413 request.addParameter("aaa[bbb][]", "aaa");
@@ -439,7 +439,7 @@
439439 request.addParameter("[aaa].bbb", "ccc");
440440 assertEquals(JSON.decode("{'':{aaa:{bbb:['aaa', 'bbb', 'ccc']}}}"), getParameterMap(request));
441441 }
442-
442+
443443 @SuppressWarnings("rawtypes")
444444 private static Map getParameterMap(MockHttpServletRequest request) throws IOException {
445445 if (request.getCharacterEncoding() == null) request.setCharacterEncoding("UTF-8");
@@ -447,7 +447,7 @@
447447 RouteMapping.parseParameter((Map)request.getParameterMap(), map);
448448 return map;
449449 }
450-
450+
451451 private static void write(HttpURLConnection con, String text) throws IOException {
452452 BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), "UTF-8"));
453453 writer.write(text);
@@ -454,12 +454,12 @@
454454 writer.flush();
455455 writer.close();
456456 }
457-
457+
458458 private static String read(InputStream in) throws IOException {
459459 BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
460460 StringBuilder sb = new StringBuilder();
461461 char[] cb = new char[1024];
462- int length = 0;
462+ int length = 0;
463463 while ((length = reader.read(cb)) != -1) {
464464 sb.append(cb, 0, length);
465465 }
--- trunk/jsonic-1.3/sample/seasar2/WEB-INF/src/sample/seasar2/web/rest/service/MemoException.java (revision 1866)
+++ trunk/jsonic-1.3/sample/seasar2/WEB-INF/src/sample/seasar2/web/rest/service/MemoException.java (revision 1867)
@@ -1,5 +1,7 @@
11 package sample.seasar2.web.rest.service;
22
3+import net.arnx.jsonic.JSONHint;
4+
35 public class MemoException extends RuntimeException {
46
57 public MemoException() {
@@ -17,9 +19,18 @@
1719 public MemoException(String message, Throwable t) {
1820 super(message, t);
1921 }
20-
22+
2123 public String getExtensionProperty() {
2224 return "extension property";
2325 }
2426
27+ @JSONHint(ignore=true)
28+ public String getIgnoreProperty() {
29+ return "ignore property";
30+ }
31+
32+ @JSONHint(name="rename")
33+ public String getRenameProperty() {
34+ return "rename property";
35+ }
2536 }
--- trunk/jsonic-1.3/sample/basic/WEB-INF/src/sample/basic/web/rest/service/MemoException.java (revision 1866)
+++ trunk/jsonic-1.3/sample/basic/WEB-INF/src/sample/basic/web/rest/service/MemoException.java (revision 1867)
@@ -1,5 +1,7 @@
11 package sample.basic.web.rest.service;
22
3+import net.arnx.jsonic.JSONHint;
4+
35 public class MemoException extends RuntimeException {
46
57 public MemoException() {
@@ -17,9 +19,18 @@
1719 public MemoException(String message, Throwable t) {
1820 super(message, t);
1921 }
20-
22+
2123 public String getExtensionProperty() {
2224 return "extension property";
2325 }
2426
27+ @JSONHint(ignore=true)
28+ public String getIgnoreProperty() {
29+ return "ignore property";
30+ }
31+
32+ @JSONHint(name="rename")
33+ public String getRenameProperty() {
34+ return "rename property";
35+ }
2536 }
--- trunk/jsonic-1.3/sample/spring/WEB-INF/src/sample/spring/web/rest/service/MemoException.java (revision 1866)
+++ trunk/jsonic-1.3/sample/spring/WEB-INF/src/sample/spring/web/rest/service/MemoException.java (revision 1867)
@@ -1,5 +1,7 @@
11 package sample.spring.web.rest.service;
22
3+import net.arnx.jsonic.JSONHint;
4+
35 public class MemoException extends RuntimeException {
46
57 public MemoException() {
@@ -17,9 +19,18 @@
1719 public MemoException(String message, Throwable t) {
1820 super(message, t);
1921 }
20-
22+
2123 public String getExtensionProperty() {
2224 return "extension property";
2325 }
2426
27+ @JSONHint(ignore=true)
28+ public String getIgnoreProperty() {
29+ return "ignore property";
30+ }
31+
32+ @JSONHint(name="rename")
33+ public String getRenameProperty() {
34+ return "rename property";
35+ }
2536 }
--- trunk/jsonic-1.3/sample/guice/WEB-INF/src/sample/guice/web/rest/service/MemoException.java (revision 1866)
+++ trunk/jsonic-1.3/sample/guice/WEB-INF/src/sample/guice/web/rest/service/MemoException.java (revision 1867)
@@ -1,5 +1,7 @@
11 package sample.guice.web.rest.service;
22
3+import net.arnx.jsonic.JSONHint;
4+
35 public class MemoException extends RuntimeException {
46
57 public MemoException() {
@@ -17,9 +19,18 @@
1719 public MemoException(String message, Throwable t) {
1820 super(message, t);
1921 }
20-
22+
2123 public String getExtensionProperty() {
2224 return "extension property";
2325 }
2426
27+ @JSONHint(ignore=true)
28+ public String getIgnoreProperty() {
29+ return "ignore property";
30+ }
31+
32+ @JSONHint(name="rename")
33+ public String getRenameProperty() {
34+ return "rename property";
35+ }
2536 }
--- trunk/jsonic-1.3/src/net/arnx/jsonic/web/Container.java (revision 1866)
+++ trunk/jsonic-1.3/src/net/arnx/jsonic/web/Container.java (revision 1867)
@@ -398,6 +398,13 @@
398398 continue;
399399 }
400400
401+ JSONHint hint = pi.getReadAnnotation(JSONHint.class);
402+ String name = pi.getName();
403+ if (hint != null) {
404+ if (hint.ignore()) continue;
405+ if (hint.name().length() != 0) name = hint.name();
406+ }
407+
401408 Object value = pi.get(cause);
402409 if (value == cause) {
403410 continue;
@@ -404,7 +411,7 @@
404411 }
405412
406413 if (data == null) data = new LinkedHashMap<String, Object>();
407- data.put(pi.getName(), value);
414+ data.put(name, value);
408415 }
409416 return (data != null) ? data : Collections.emptyMap();
410417 }
--- trunk/jsonic-1.3/docs/index.html (revision 1866)
+++ trunk/jsonic-1.3/docs/index.html (revision 1867)
@@ -869,9 +869,10 @@
869869
870870 <h2 id="releasenote">リリースノート</h2>
871871
872-<h3>2015/10/16 version 1.3.10</h3>
872+<h3>2015/10/16 version 1.3.10 beta2</h3>
873873 <ul>
874874 <li>[不具合修正] JSONWriter にて配列中のオブジェクトや配列の後ろのカンマが出力されない問題を修正しました。</li>
875+<li>[不具合修正] JSON WebService にて例外発生時に Exception のプロパティに JSONHint が適用されない問題を ignore と name についてのみ適用されるよう修正しました。</li>
875876 <li>[機能追加] JSONReader にて値の読み取りをスキップしてメモリを節約できる skipValue() メソッドを追加しました。</li>
876877 <li>[機能追加] JSONWriter にて値をそのまま出力できる append(String text) メソッドを追加しました。</li>
877878 </ul>
旧リポジトリブラウザで表示