mirror of
https://github.com/fangyidong/json-simple.git
synced 2025-12-06 07:20:53 +03:00
init
This commit is contained in:
8
.classpath
Normal file
8
.classpath
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry excluding="**/.svn|**/.svn/**/*" kind="src" output="build/main" path="src"/>
|
||||||
|
<classpathentry excluding="**/.svn|**/.svn/**/*" kind="src" output="build/test" path="test"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3.8.1"/>
|
||||||
|
<classpathentry kind="output" path="build/main"/>
|
||||||
|
</classpath>
|
||||||
17
.project
Normal file
17
.project
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>json.simple</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
||||||
1
AUTHORS.txt
Normal file
1
AUTHORS.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Fang Yidong <fangyidong@yahoo.com.cn>
|
||||||
11
ChangeLog.txt
Normal file
11
ChangeLog.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
ChangeLog
|
||||||
|
|
||||||
|
Version 1.01 (2008/08/26)
|
||||||
|
* License changed to a more commerce friendly and clear one, Apache License 2.0
|
||||||
|
* Use JFlex to generate a faster Yylex.java
|
||||||
|
* Added Rope.java to get faster string operations
|
||||||
|
* Separate test codes from source codes
|
||||||
|
* Added ant build file build.xml
|
||||||
|
|
||||||
|
Version 1.0 (2006/04/15)
|
||||||
|
* Initial version
|
||||||
202
LICENSE.txt
Normal file
202
LICENSE.txt
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
|
||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
153
README.txt
Normal file
153
README.txt
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
Simple Java toolkit for JSON (JSON.simple)
|
||||||
|
==========================================
|
||||||
|
|
||||||
|
http://www.JSON.org/java/json_simple.zip
|
||||||
|
|
||||||
|
1.Why the Simple Java toolkit (also named as JSON.simple) for JSON?
|
||||||
|
|
||||||
|
When I use JSON as the data exchange format between the AJAX client and JSP
|
||||||
|
for the first time, what worry me mostly is how to encode Java strings and
|
||||||
|
numbers correctly in the server side so the AJAX client will receive a well
|
||||||
|
formed JSON data. When I looked into the 'JSON in Java' directory in JSON
|
||||||
|
website,I found that wrappers to JSONObject and JSONArray can be simpler,
|
||||||
|
due to the simplicity of JSON itself. So I wrote the JSON.simple package.
|
||||||
|
|
||||||
|
2.Is it simple,really?
|
||||||
|
|
||||||
|
I think so. Take an example:
|
||||||
|
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
JSONObject obj=new JSONObject();
|
||||||
|
obj.put("name","foo");
|
||||||
|
obj.put("num",new Integer(100));
|
||||||
|
obj.put("balance",new Double(1000.21));
|
||||||
|
obj.put("is_vip",new Boolean(true));
|
||||||
|
obj.put("nickname",null);
|
||||||
|
System.out.print(obj);
|
||||||
|
|
||||||
|
Result:
|
||||||
|
{"nickname":null,"num":100,"balance":1000.21,"is_vip":true,"name":"foo"}
|
||||||
|
|
||||||
|
The JSONObject.toString() will escape controls and specials correctly.
|
||||||
|
|
||||||
|
3.How to use JSON.simple in JSP?
|
||||||
|
|
||||||
|
Take an example in JSP:
|
||||||
|
|
||||||
|
<%@page contentType="text/html; charset=UTF-8"%>
|
||||||
|
<%@page import="org.json.simple.JSONObject"%>
|
||||||
|
<%
|
||||||
|
JSONObject obj=new JSONObject();
|
||||||
|
obj.put("name","foo");
|
||||||
|
obj.put("num",new Integer(100));
|
||||||
|
obj.put("balance",new Double(1000.21));
|
||||||
|
obj.put("is_vip",new Boolean(true));
|
||||||
|
obj.put("nickname",null);
|
||||||
|
out.print(obj);
|
||||||
|
out.flush();
|
||||||
|
%>
|
||||||
|
|
||||||
|
So the AJAX client will get the responseText.
|
||||||
|
|
||||||
|
4.Some details about JSONObject?
|
||||||
|
|
||||||
|
JSONObject inherits java.util.HashMap,so it don't have to worry about the
|
||||||
|
mapping things between keys and values. Feel free to use the Map methods
|
||||||
|
like get(), put(), and remove() and others. JSONObject.toString() will
|
||||||
|
combine key value pairs to get the JSON data string. Values will be escaped
|
||||||
|
into JSON quote string format if it's an instance of java.lang.String. Other
|
||||||
|
type of instance like java.lang.Number,java.lang.Boolean,null,JSONObject and
|
||||||
|
JSONArray will NOT escape, just take their java.lang.String.valueOf() result.
|
||||||
|
null value will be the JSON 'null' in the result.
|
||||||
|
|
||||||
|
It's still correct if you put an instance of JSONObject or JSONArray into an
|
||||||
|
instance of JSONObject or JSONArray. Take the example about:
|
||||||
|
|
||||||
|
JSONObject obj2=new JSONObject();
|
||||||
|
obj2.put("phone","123456");
|
||||||
|
obj2.put("zip","7890");
|
||||||
|
obj.put("contact",obj2);
|
||||||
|
System.out.print(obj);
|
||||||
|
|
||||||
|
Result:
|
||||||
|
{"nickname":null,"num":100,"contact":{"phone":"123456","zip":"7890"},"balance":1000.21,"is_vip":true,"name":"foo"}
|
||||||
|
|
||||||
|
The method JSONObject.escape() is used to escape Java string into JSON quote
|
||||||
|
string. Controls and specials will be escaped correctly into \b,\f,\r,\n,\t,
|
||||||
|
\",\\,\/,\uhhhh.
|
||||||
|
|
||||||
|
5.Some detail about JSONArray?
|
||||||
|
|
||||||
|
org.json.simple.JSONArray inherits java.util.ArrayList. Feel free to use the
|
||||||
|
List methods like get(),add(),remove(),iterator() and so on. The rules of
|
||||||
|
JSONArray.toString() is similar to JSONObject.toString(). Here's the example:
|
||||||
|
|
||||||
|
import org.json.simple.JSONArray;
|
||||||
|
|
||||||
|
JSONArray array=new JSONArray();
|
||||||
|
array.add("hello");
|
||||||
|
array.add(new Integer(123));
|
||||||
|
array.add(new Boolean(false));
|
||||||
|
array.add(null);
|
||||||
|
array.add(new Double(123.45));
|
||||||
|
array.add(obj2);//see above
|
||||||
|
System.out.print(array);
|
||||||
|
|
||||||
|
Result:
|
||||||
|
["hello",123,false,null,123.45,{"phone":"123456","zip":"7890"}]
|
||||||
|
|
||||||
|
6.What is JSONValue for?
|
||||||
|
|
||||||
|
org.json.simple.JSONValue is use to parse JSON data into Java Object.
|
||||||
|
In JSON, the topmost entity is JSON value, not the JSON object. But
|
||||||
|
it's not necessary to wrap JSON string,boolean,number and null again,
|
||||||
|
for the Java has already had the according classes: java.lang.String,
|
||||||
|
java.lang.Boolean,java.lang.Number and null. The mapping is:
|
||||||
|
|
||||||
|
JSON Java
|
||||||
|
------------------------------------------------
|
||||||
|
string <=> java.lang.String
|
||||||
|
number <=> java.lang.Number
|
||||||
|
true|false <=> java.lang.Boolean
|
||||||
|
null <=> null
|
||||||
|
array <=> org.json.simple.JSONArray
|
||||||
|
object <=> org.json.simple.JSONObject
|
||||||
|
------------------------------------------------
|
||||||
|
|
||||||
|
JSONValue has only one kind of method, JSONValue.parse(), which receives
|
||||||
|
a java.io.Reader or java.lang.String. Return type of JSONValue.parse()
|
||||||
|
is according to the mapping above. If the input is incorrect in syntax or
|
||||||
|
there's exceptions during the parsing, I choose to return null, ignoring
|
||||||
|
the exception: I have no idea if it's a serious implementaion, but I think
|
||||||
|
it's convenient to the user.
|
||||||
|
|
||||||
|
Here's the example:
|
||||||
|
|
||||||
|
String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
|
||||||
|
Object obj=JSONValue.parse(s);
|
||||||
|
JSONArray array=(JSONArray)obj;
|
||||||
|
System.out.println(array.get(1));
|
||||||
|
JSONObject obj2=(JSONObject)array.get(1);
|
||||||
|
System.out.println(obj2.get("1"));
|
||||||
|
|
||||||
|
Result:
|
||||||
|
{"1":{"2":{"3":{"4":[5,{"6":7}]}}}}
|
||||||
|
{"2":{"3":{"4":[5,{"6":7}]}}}
|
||||||
|
|
||||||
|
7.About the author.
|
||||||
|
|
||||||
|
I'm a Java EE developer on Linux.
|
||||||
|
I'm working on web systems and information retrieval systems.
|
||||||
|
I also develop 3D games and Flash games.
|
||||||
|
|
||||||
|
You can contact me through:
|
||||||
|
Fang Yidong<fangyidong@yahoo.com.cn>
|
||||||
|
Fang Yidong<fangyidong@gmail.com>
|
||||||
|
|
||||||
|
8.Project home.
|
||||||
|
|
||||||
|
http://code.google.com/p/json-simple/
|
||||||
|
|
||||||
|
|
||||||
|
http://www.JSON.org/java/json_simple.zip
|
||||||
1
VERSION.txt
Normal file
1
VERSION.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
1.0.1
|
||||||
32
build.xml
Normal file
32
build.xml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<project name="json-simple" default="main" basedir=".">
|
||||||
|
<property name="current-version" value="1.0.1"/>
|
||||||
|
<property name="jar-name" value="json_simple-${current-version}.jar"/>
|
||||||
|
|
||||||
|
<target name="main" depends="mkdir,compile,jar">
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="clean">
|
||||||
|
<delete includeemptydirs="true">
|
||||||
|
<fileset dir="build/main" includes="**/*"/>
|
||||||
|
</delete>
|
||||||
|
<delete file="lib/${jar-name}"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="mkdir">
|
||||||
|
<mkdir dir="build/main"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="compile">
|
||||||
|
<javac srcdir="src"
|
||||||
|
destdir="build/main"
|
||||||
|
includes="**/*.java"
|
||||||
|
target="1.2"
|
||||||
|
source="1.2"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="jar">
|
||||||
|
<jar destfile="lib/${jar-name}"
|
||||||
|
basedir="build/main"
|
||||||
|
includes="**/*.class"/>
|
||||||
|
</target>
|
||||||
|
</project>
|
||||||
47
doc/json.lex
Normal file
47
doc/json.lex
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package org.json.simple.parser;
|
||||||
|
|
||||||
|
import org.json.simple.rope.Rope;
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
%{
|
||||||
|
private Rope sb=new Rope();
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
|
%switch
|
||||||
|
%unicode
|
||||||
|
%state STRING_BEGIN
|
||||||
|
|
||||||
|
HEX_D = [a-fA-F0-9]
|
||||||
|
INT = [-]?[0-9]+
|
||||||
|
DOUBLE = {INT}((\.[0-9]+)?([eE][-+]?[0-9]+)?)
|
||||||
|
WS = [ \t\r\n]
|
||||||
|
%%
|
||||||
|
|
||||||
|
<STRING_BEGIN> \\\" {sb.append('"');}
|
||||||
|
<STRING_BEGIN> \\\\ {sb.append('\\');}
|
||||||
|
<STRING_BEGIN> \\\/ {sb.append('/');}
|
||||||
|
<STRING_BEGIN> \\b {sb.append('\b');}
|
||||||
|
<STRING_BEGIN> \\f {sb.append('\f');}
|
||||||
|
<STRING_BEGIN> \\n {sb.append('\n');}
|
||||||
|
<STRING_BEGIN> \\r {sb.append('\r');}
|
||||||
|
<STRING_BEGIN> \\t {sb.append('\t');}
|
||||||
|
<STRING_BEGIN> \\u{HEX_D}{HEX_D}{HEX_D}{HEX_D} { int ch=Integer.parseInt(yytext().substring(2),16);
|
||||||
|
sb.append((char)ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
<STRING_BEGIN> \" { yybegin(YYINITIAL);return new Yytoken(Yytoken.TYPE_VALUE,sb.toString());}
|
||||||
|
<STRING_BEGIN> . { sb.append(yytext());}
|
||||||
|
<YYINITIAL> \" { sb.clear();yybegin(STRING_BEGIN);}
|
||||||
|
<YYINITIAL> {INT} { Long val=Long.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE,val);}
|
||||||
|
<YYINITIAL> {DOUBLE} { Double val=Double.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE,val);}
|
||||||
|
<YYINITIAL> "true"|"false" { Boolean val=Boolean.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE,val);}
|
||||||
|
<YYINITIAL> "null" { return new Yytoken(Yytoken.TYPE_VALUE,null);}
|
||||||
|
<YYINITIAL> "{" { return new Yytoken(Yytoken.TYPE_LEFT_BRACE,null);}
|
||||||
|
<YYINITIAL> "}" { return new Yytoken(Yytoken.TYPE_RIGHT_BRACE,null);}
|
||||||
|
<YYINITIAL> "[" { return new Yytoken(Yytoken.TYPE_LEFT_SQUARE,null);}
|
||||||
|
<YYINITIAL> "]" { return new Yytoken(Yytoken.TYPE_RIGHT_SQUARE,null);}
|
||||||
|
<YYINITIAL> "," { return new Yytoken(Yytoken.TYPE_COMMA,null);}
|
||||||
|
<YYINITIAL> ":" { return new Yytoken(Yytoken.TYPE_COLON,null);}
|
||||||
|
<YYINITIAL> {WS} {}
|
||||||
BIN
lib/json_simple-1.0.1.jar
Normal file
BIN
lib/json_simple-1.0.1.jar
Normal file
Binary file not shown.
147
src/org/json/simple/ItemList.java
Normal file
147
src/org/json/simple/ItemList.java
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
/*
|
||||||
|
* $Id: ItemList.java,v 1.1 2006/04/15 14:10:48 platform Exp $
|
||||||
|
* Created on 2006-3-24
|
||||||
|
*/
|
||||||
|
package org.json.simple;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* |a:b:c| => |a|,|b|,|c|
|
||||||
|
* |:| => ||,||
|
||||||
|
* |a:| => |a|,||
|
||||||
|
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||||
|
*/
|
||||||
|
public class ItemList {
|
||||||
|
private String sp=",";
|
||||||
|
List items=new ArrayList();
|
||||||
|
|
||||||
|
|
||||||
|
public ItemList(){}
|
||||||
|
|
||||||
|
|
||||||
|
public ItemList(String s){
|
||||||
|
this.split(s,sp,items);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemList(String s,String sp){
|
||||||
|
this.sp=s;
|
||||||
|
this.split(s,sp,items);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemList(String s,String sp,boolean isMultiToken){
|
||||||
|
split(s,sp,items,isMultiToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List getItems(){
|
||||||
|
return this.items;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getArray(){
|
||||||
|
return (String[])this.items.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void split(String s,String sp,List append,boolean isMultiToken){
|
||||||
|
if(s==null || sp==null)
|
||||||
|
return;
|
||||||
|
if(isMultiToken){
|
||||||
|
StringTokenizer tokens=new StringTokenizer(s,sp);
|
||||||
|
while(tokens.hasMoreTokens()){
|
||||||
|
append.add(tokens.nextToken().trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
this.split(s,sp,append);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void split(String s,String sp,List append){
|
||||||
|
if(s==null || sp==null)
|
||||||
|
return;
|
||||||
|
int pos=0;
|
||||||
|
int prevPos=0;
|
||||||
|
do{
|
||||||
|
prevPos=pos;
|
||||||
|
pos=s.indexOf(sp,pos);
|
||||||
|
if(pos==-1)
|
||||||
|
break;
|
||||||
|
append.add(s.substring(prevPos,pos).trim());
|
||||||
|
pos+=sp.length();
|
||||||
|
}while(pos!=-1);
|
||||||
|
append.add(s.substring(prevPos).trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSP(String sp){
|
||||||
|
this.sp=sp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(int i,String item){
|
||||||
|
if(item==null)
|
||||||
|
return;
|
||||||
|
items.add(i,item.trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(String item){
|
||||||
|
if(item==null)
|
||||||
|
return;
|
||||||
|
items.add(item.trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAll(ItemList list){
|
||||||
|
items.addAll(list.items);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAll(String s){
|
||||||
|
this.split(s,sp,items);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAll(String s,String sp){
|
||||||
|
this.split(s,sp,items);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addAll(String s,String sp,boolean isMultiToken){
|
||||||
|
this.split(s,sp,items,isMultiToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param i 0-based
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String get(int i){
|
||||||
|
return (String)items.get(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int size(){
|
||||||
|
return items.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
return toString(sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(String sp){
|
||||||
|
StringBuffer sb=new StringBuffer();
|
||||||
|
|
||||||
|
for(int i=0;i<items.size();i++){
|
||||||
|
if(i==0)
|
||||||
|
sb.append(items.get(i));
|
||||||
|
else{
|
||||||
|
sb.append(sp);
|
||||||
|
sb.append(items.get(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear(){
|
||||||
|
items.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset(){
|
||||||
|
sp=",";
|
||||||
|
items.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
31
src/org/json/simple/JSONArray.java
Normal file
31
src/org/json/simple/JSONArray.java
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* $Id: JSONArray.java,v 1.1 2006/04/15 14:10:48 platform Exp $
|
||||||
|
* Created on 2006-4-10
|
||||||
|
*/
|
||||||
|
package org.json.simple;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||||
|
*/
|
||||||
|
public class JSONArray extends ArrayList {
|
||||||
|
public String toString(){
|
||||||
|
ItemList list=new ItemList();
|
||||||
|
|
||||||
|
Iterator iter=iterator();
|
||||||
|
|
||||||
|
while(iter.hasNext()){
|
||||||
|
Object value=iter.next();
|
||||||
|
if(value instanceof String){
|
||||||
|
list.add("\""+JSONObject.escape((String)value)+"\"");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
list.add(String.valueOf(value));
|
||||||
|
}
|
||||||
|
return "["+list.toString()+"]";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
100
src/org/json/simple/JSONObject.java
Normal file
100
src/org/json/simple/JSONObject.java
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* $Id: JSONObject.java,v 1.1 2006/04/15 14:10:48 platform Exp $
|
||||||
|
* Created on 2006-4-10
|
||||||
|
*/
|
||||||
|
package org.json.simple;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||||
|
*/
|
||||||
|
public class JSONObject extends HashMap{
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
ItemList list=new ItemList();
|
||||||
|
Iterator iter=entrySet().iterator();
|
||||||
|
|
||||||
|
while(iter.hasNext()){
|
||||||
|
Map.Entry entry=(Map.Entry)iter.next();
|
||||||
|
list.add(toString(entry.getKey().toString(),entry.getValue()));
|
||||||
|
}
|
||||||
|
return "{"+list.toString()+"}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toString(String key,Object value){
|
||||||
|
StringBuffer sb=new StringBuffer();
|
||||||
|
|
||||||
|
sb.append("\"");
|
||||||
|
sb.append(escape(key));
|
||||||
|
sb.append("\":");
|
||||||
|
if(value==null){
|
||||||
|
sb.append("null");
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(value instanceof String){
|
||||||
|
sb.append("\"");
|
||||||
|
sb.append(escape((String)value));
|
||||||
|
sb.append("\"");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sb.append(value);
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* " => \" , \ => \\
|
||||||
|
* @param s
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static String escape(String s){
|
||||||
|
if(s==null)
|
||||||
|
return null;
|
||||||
|
StringBuffer sb=new StringBuffer();
|
||||||
|
for(int i=0;i<s.length();i++){
|
||||||
|
char ch=s.charAt(i);
|
||||||
|
switch(ch){
|
||||||
|
case '"':
|
||||||
|
sb.append("\\\"");
|
||||||
|
break;
|
||||||
|
case '\\':
|
||||||
|
sb.append("\\\\");
|
||||||
|
break;
|
||||||
|
case '\b':
|
||||||
|
sb.append("\\b");
|
||||||
|
break;
|
||||||
|
case '\f':
|
||||||
|
sb.append("\\f");
|
||||||
|
break;
|
||||||
|
case '\n':
|
||||||
|
sb.append("\\n");
|
||||||
|
break;
|
||||||
|
case '\r':
|
||||||
|
sb.append("\\r");
|
||||||
|
break;
|
||||||
|
case '\t':
|
||||||
|
sb.append("\\t");
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
sb.append("\\/");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if(ch>='\u0000' && ch<='\u001F'){
|
||||||
|
String ss=Integer.toHexString(ch);
|
||||||
|
sb.append("\\u");
|
||||||
|
for(int k=0;k<4-ss.length();k++){
|
||||||
|
sb.append('0');
|
||||||
|
}
|
||||||
|
sb.append(ss.toUpperCase());
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sb.append(ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}//for
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
36
src/org/json/simple/JSONValue.java
Normal file
36
src/org/json/simple/JSONValue.java
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* $Id: JSONValue.java,v 1.1 2006/04/15 14:37:04 platform Exp $
|
||||||
|
* Created on 2006-4-15
|
||||||
|
*/
|
||||||
|
package org.json.simple;
|
||||||
|
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.io.StringReader;
|
||||||
|
|
||||||
|
import org.json.simple.parser.JSONParser;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||||
|
*/
|
||||||
|
public class JSONValue {
|
||||||
|
/**
|
||||||
|
* parse into java object from input source.
|
||||||
|
* @param in
|
||||||
|
* @return instance of : JSONObject,JSONArray,String,Boolean,Long,Double or null
|
||||||
|
*/
|
||||||
|
public static Object parse(Reader in){
|
||||||
|
try{
|
||||||
|
JSONParser parser=new JSONParser();
|
||||||
|
return parser.parse(in);
|
||||||
|
}
|
||||||
|
catch(Exception e){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object parse(String s){
|
||||||
|
StringReader in=new StringReader(s);
|
||||||
|
return parse(in);
|
||||||
|
}
|
||||||
|
}
|
||||||
190
src/org/json/simple/parser/JSONParser.java
Normal file
190
src/org/json/simple/parser/JSONParser.java
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
/*
|
||||||
|
* $Id: JSONParser.java,v 1.1 2006/04/15 14:10:48 platform Exp $
|
||||||
|
* Created on 2006-4-15
|
||||||
|
*/
|
||||||
|
package org.json.simple.parser;
|
||||||
|
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
import org.json.simple.JSONArray;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||||
|
*/
|
||||||
|
public class JSONParser {
|
||||||
|
public static final int S_INIT=0;
|
||||||
|
public static final int S_IN_FINISHED_VALUE=1;//string,number,boolean,null,object,array
|
||||||
|
public static final int S_IN_OBJECT=2;
|
||||||
|
public static final int S_IN_ARRAY=3;
|
||||||
|
public static final int S_PASSED_PAIR_KEY=4;
|
||||||
|
public static final int S_IN_ERROR=-1;
|
||||||
|
|
||||||
|
private int peekStatus(LinkedList statusStack){
|
||||||
|
if(statusStack.size()==0)
|
||||||
|
return -1;
|
||||||
|
Integer status=(Integer)statusStack.getFirst();
|
||||||
|
return status.intValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object parse(Reader in) throws Exception{
|
||||||
|
LinkedList statusStack=new LinkedList();
|
||||||
|
LinkedList valueStack=new LinkedList();
|
||||||
|
Yylex lexer=new Yylex(in);
|
||||||
|
Yytoken token=null;
|
||||||
|
int status=S_INIT;
|
||||||
|
|
||||||
|
try{
|
||||||
|
do{
|
||||||
|
token=lexer.yylex();
|
||||||
|
if(token==null)
|
||||||
|
token=new Yytoken(Yytoken.TYPE_EOF,null);
|
||||||
|
switch(status){
|
||||||
|
case S_INIT:
|
||||||
|
switch(token.type){
|
||||||
|
case Yytoken.TYPE_VALUE:
|
||||||
|
status=S_IN_FINISHED_VALUE;
|
||||||
|
statusStack.addFirst(new Integer(status));
|
||||||
|
valueStack.addFirst(token.value);
|
||||||
|
break;
|
||||||
|
case Yytoken.TYPE_LEFT_BRACE:
|
||||||
|
status=S_IN_OBJECT;
|
||||||
|
statusStack.addFirst(new Integer(status));
|
||||||
|
valueStack.addFirst(new JSONObject());
|
||||||
|
break;
|
||||||
|
case Yytoken.TYPE_LEFT_SQUARE:
|
||||||
|
status=S_IN_ARRAY;
|
||||||
|
statusStack.addFirst(new Integer(status));
|
||||||
|
valueStack.addFirst(new JSONArray());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
status=S_IN_ERROR;
|
||||||
|
}//inner switch
|
||||||
|
break;
|
||||||
|
|
||||||
|
case S_IN_FINISHED_VALUE:
|
||||||
|
if(token.type==Yytoken.TYPE_EOF)
|
||||||
|
return valueStack.removeFirst();
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
|
||||||
|
case S_IN_OBJECT:
|
||||||
|
switch(token.type){
|
||||||
|
case Yytoken.TYPE_COMMA:
|
||||||
|
break;
|
||||||
|
case Yytoken.TYPE_VALUE:
|
||||||
|
if(token.value instanceof String){
|
||||||
|
String key=(String)token.value;
|
||||||
|
valueStack.addFirst(key);
|
||||||
|
status=S_PASSED_PAIR_KEY;
|
||||||
|
statusStack.addFirst(new Integer(status));
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
status=S_IN_ERROR;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Yytoken.TYPE_RIGHT_BRACE:
|
||||||
|
if(valueStack.size()>1){
|
||||||
|
statusStack.removeFirst();
|
||||||
|
valueStack.removeFirst();
|
||||||
|
status=peekStatus(statusStack);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
status=S_IN_FINISHED_VALUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
status=S_IN_ERROR;
|
||||||
|
break;
|
||||||
|
}//inner switch
|
||||||
|
break;
|
||||||
|
|
||||||
|
case S_PASSED_PAIR_KEY:
|
||||||
|
switch(token.type){
|
||||||
|
case Yytoken.TYPE_COLON:
|
||||||
|
break;
|
||||||
|
case Yytoken.TYPE_VALUE:
|
||||||
|
statusStack.removeFirst();
|
||||||
|
String key=(String)valueStack.removeFirst();
|
||||||
|
JSONObject parent=(JSONObject)valueStack.getFirst();
|
||||||
|
parent.put(key,token.value);
|
||||||
|
status=peekStatus(statusStack);
|
||||||
|
break;
|
||||||
|
case Yytoken.TYPE_LEFT_SQUARE:
|
||||||
|
statusStack.removeFirst();
|
||||||
|
key=(String)valueStack.removeFirst();
|
||||||
|
parent=(JSONObject)valueStack.getFirst();
|
||||||
|
JSONArray newArray=new JSONArray();
|
||||||
|
parent.put(key,newArray);
|
||||||
|
status=S_IN_ARRAY;
|
||||||
|
statusStack.addFirst(new Integer(status));
|
||||||
|
valueStack.addFirst(newArray);
|
||||||
|
break;
|
||||||
|
case Yytoken.TYPE_LEFT_BRACE:
|
||||||
|
statusStack.removeFirst();
|
||||||
|
key=(String)valueStack.removeFirst();
|
||||||
|
parent=(JSONObject)valueStack.getFirst();
|
||||||
|
JSONObject newObject=new JSONObject();
|
||||||
|
parent.put(key,newObject);
|
||||||
|
status=S_IN_OBJECT;
|
||||||
|
statusStack.addFirst(new Integer(status));
|
||||||
|
valueStack.addFirst(newObject);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
status=S_IN_ERROR;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case S_IN_ARRAY:
|
||||||
|
switch(token.type){
|
||||||
|
case Yytoken.TYPE_COMMA:
|
||||||
|
break;
|
||||||
|
case Yytoken.TYPE_VALUE:
|
||||||
|
JSONArray val=(JSONArray)valueStack.getFirst();
|
||||||
|
val.add(token.value);
|
||||||
|
break;
|
||||||
|
case Yytoken.TYPE_RIGHT_SQUARE:
|
||||||
|
if(valueStack.size()>1){
|
||||||
|
statusStack.removeFirst();
|
||||||
|
valueStack.removeFirst();
|
||||||
|
status=peekStatus(statusStack);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
status=S_IN_FINISHED_VALUE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Yytoken.TYPE_LEFT_BRACE:
|
||||||
|
val=(JSONArray)valueStack.getFirst();
|
||||||
|
JSONObject newObject=new JSONObject();
|
||||||
|
val.add(newObject);
|
||||||
|
status=S_IN_OBJECT;
|
||||||
|
statusStack.addFirst(new Integer(status));
|
||||||
|
valueStack.addFirst(newObject);
|
||||||
|
break;
|
||||||
|
case Yytoken.TYPE_LEFT_SQUARE:
|
||||||
|
val=(JSONArray)valueStack.getFirst();
|
||||||
|
JSONArray newArray=new JSONArray();
|
||||||
|
val.add(newArray);
|
||||||
|
status=S_IN_ARRAY;
|
||||||
|
statusStack.addFirst(new Integer(status));
|
||||||
|
valueStack.addFirst(newArray);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
status=S_IN_ERROR;
|
||||||
|
}//inner switch
|
||||||
|
break;
|
||||||
|
case S_IN_ERROR:
|
||||||
|
return null;
|
||||||
|
}//switch
|
||||||
|
if(status==S_IN_ERROR)
|
||||||
|
return null;
|
||||||
|
}while(token.type!=Yytoken.TYPE_EOF);
|
||||||
|
}
|
||||||
|
catch(Exception e){
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
736
src/org/json/simple/parser/Yylex.java
Normal file
736
src/org/json/simple/parser/Yylex.java
Normal file
@@ -0,0 +1,736 @@
|
|||||||
|
/* The following code was generated by JFlex 1.4.2 on 2008-11-25 */
|
||||||
|
|
||||||
|
package org.json.simple.parser;
|
||||||
|
|
||||||
|
import org.json.simple.rope.Rope;
|
||||||
|
|
||||||
|
class Yylex {
|
||||||
|
|
||||||
|
/** This character denotes the end of file */
|
||||||
|
public static final int YYEOF = -1;
|
||||||
|
|
||||||
|
/** initial size of the lookahead buffer */
|
||||||
|
private static final int ZZ_BUFFERSIZE = 16384;
|
||||||
|
|
||||||
|
/** lexical states */
|
||||||
|
public static final int YYINITIAL = 0;
|
||||||
|
public static final int STRING_BEGIN = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
|
||||||
|
* ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
|
||||||
|
* at the beginning of a line
|
||||||
|
* l is of the form l = 2*k, k a non negative integer
|
||||||
|
*/
|
||||||
|
private static final int ZZ_LEXSTATE[] = {
|
||||||
|
0, 0, 1, 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates characters to character classes
|
||||||
|
*/
|
||||||
|
private static final String ZZ_CMAP_PACKED =
|
||||||
|
"\11\0\1\7\1\21\2\0\1\7\22\0\1\7\1\0\1\11\10\0"+
|
||||||
|
"\1\6\1\32\1\2\1\4\1\12\12\3\1\33\6\0\4\1\1\5"+
|
||||||
|
"\1\1\24\0\1\30\1\10\1\31\3\0\1\23\1\13\2\1\1\22"+
|
||||||
|
"\1\14\5\0\1\24\1\0\1\15\3\0\1\16\1\25\1\17\1\20"+
|
||||||
|
"\5\0\1\26\1\0\1\27\uff82\0";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates characters to character classes
|
||||||
|
*/
|
||||||
|
private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Translates DFA states to action switch labels.
|
||||||
|
*/
|
||||||
|
private static final int [] ZZ_ACTION = zzUnpackAction();
|
||||||
|
|
||||||
|
private static final String ZZ_ACTION_PACKED_0 =
|
||||||
|
"\3\0\1\1\1\2\1\3\3\0\1\4\1\5\1\6"+
|
||||||
|
"\1\7\1\10\1\11\2\12\1\13\5\0\1\14\1\15"+
|
||||||
|
"\1\16\1\17\1\20\1\21\1\22\1\23\1\0\1\24"+
|
||||||
|
"\1\0\1\24\4\0\1\25\1\26\2\0\1\27";
|
||||||
|
|
||||||
|
private static int [] zzUnpackAction() {
|
||||||
|
int [] result = new int[44];
|
||||||
|
int offset = 0;
|
||||||
|
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int zzUnpackAction(String packed, int offset, int [] result) {
|
||||||
|
int i = 0; /* index in packed string */
|
||||||
|
int j = offset; /* index in unpacked array */
|
||||||
|
int l = packed.length();
|
||||||
|
while (i < l) {
|
||||||
|
int count = packed.charAt(i++);
|
||||||
|
int value = packed.charAt(i++);
|
||||||
|
do result[j++] = value; while (--count > 0);
|
||||||
|
}
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* error codes */
|
||||||
|
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||||
|
private static final int ZZ_NO_MATCH = 1;
|
||||||
|
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||||
|
|
||||||
|
/* error messages for the codes above */
|
||||||
|
private static final String ZZ_ERROR_MSG[] = {
|
||||||
|
"Unkown internal scanner error",
|
||||||
|
"Error: could not match input",
|
||||||
|
"Error: pushback value was too large"
|
||||||
|
};
|
||||||
|
|
||||||
|
/** the input device */
|
||||||
|
private java.io.Reader zzReader;
|
||||||
|
|
||||||
|
/** the current state of the DFA */
|
||||||
|
private int zzState;
|
||||||
|
|
||||||
|
/** the current lexical state */
|
||||||
|
private int zzLexicalState = YYINITIAL;
|
||||||
|
|
||||||
|
/** this buffer contains the current text to be matched and is
|
||||||
|
the source of the yytext() string */
|
||||||
|
private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
|
||||||
|
|
||||||
|
/** the textposition at the last accepting state */
|
||||||
|
private int zzMarkedPos;
|
||||||
|
|
||||||
|
/** the current text position in the buffer */
|
||||||
|
private int zzCurrentPos;
|
||||||
|
|
||||||
|
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||||
|
private int zzStartRead;
|
||||||
|
|
||||||
|
/** endRead marks the last character in the buffer, that has been read
|
||||||
|
from input */
|
||||||
|
private int zzEndRead;
|
||||||
|
|
||||||
|
/** number of newlines encountered up to the start of the matched text */
|
||||||
|
private int yyline;
|
||||||
|
|
||||||
|
/** the number of characters up to the start of the matched text */
|
||||||
|
private int yychar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the number of characters from the last newline up to the start of the
|
||||||
|
* matched text
|
||||||
|
*/
|
||||||
|
private int yycolumn;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* zzAtBOL == true <=> the scanner is currently at the beginning of a line
|
||||||
|
*/
|
||||||
|
private boolean zzAtBOL = true;
|
||||||
|
|
||||||
|
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||||
|
private boolean zzAtEOF;
|
||||||
|
|
||||||
|
/* user code: */
|
||||||
|
private Rope sb=new Rope();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new scanner
|
||||||
|
* There is also a java.io.InputStream version of this constructor.
|
||||||
|
*
|
||||||
|
* @param in the java.io.Reader to read input from.
|
||||||
|
*/
|
||||||
|
Yylex(java.io.Reader in) {
|
||||||
|
this.zzReader = in;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new scanner.
|
||||||
|
* There is also java.io.Reader version of this constructor.
|
||||||
|
*
|
||||||
|
* @param in the java.io.Inputstream to read input from.
|
||||||
|
*/
|
||||||
|
Yylex(java.io.InputStream in) {
|
||||||
|
this(new java.io.InputStreamReader(in));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unpacks the compressed character translation table.
|
||||||
|
*
|
||||||
|
* @param packed the packed character translation table
|
||||||
|
* @return the unpacked character translation table
|
||||||
|
*/
|
||||||
|
private static char [] zzUnpackCMap(String packed) {
|
||||||
|
char [] map = new char[0x10000];
|
||||||
|
int i = 0; /* index in packed string */
|
||||||
|
int j = 0; /* index in unpacked array */
|
||||||
|
while (i < 90) {
|
||||||
|
int count = packed.charAt(i++);
|
||||||
|
char value = packed.charAt(i++);
|
||||||
|
do map[j++] = value; while (--count > 0);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refills the input buffer.
|
||||||
|
*
|
||||||
|
* @return <code>false</code>, iff there was new input.
|
||||||
|
*
|
||||||
|
* @exception java.io.IOException if any I/O-Error occurs
|
||||||
|
*/
|
||||||
|
private boolean zzRefill() throws java.io.IOException {
|
||||||
|
|
||||||
|
/* first: make room (if you can) */
|
||||||
|
if (zzStartRead > 0) {
|
||||||
|
System.arraycopy(zzBuffer, zzStartRead,
|
||||||
|
zzBuffer, 0,
|
||||||
|
zzEndRead-zzStartRead);
|
||||||
|
|
||||||
|
/* translate stored positions */
|
||||||
|
zzEndRead-= zzStartRead;
|
||||||
|
zzCurrentPos-= zzStartRead;
|
||||||
|
zzMarkedPos-= zzStartRead;
|
||||||
|
zzStartRead = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* is the buffer big enough? */
|
||||||
|
if (zzCurrentPos >= zzBuffer.length) {
|
||||||
|
/* if not: blow it up */
|
||||||
|
char newBuffer[] = new char[zzCurrentPos*2];
|
||||||
|
System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
|
||||||
|
zzBuffer = newBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* finally: fill the buffer with new input */
|
||||||
|
int numRead = zzReader.read(zzBuffer, zzEndRead,
|
||||||
|
zzBuffer.length-zzEndRead);
|
||||||
|
|
||||||
|
if (numRead > 0) {
|
||||||
|
zzEndRead+= numRead;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// unlikely but not impossible: read 0 characters, but not at end of stream
|
||||||
|
if (numRead == 0) {
|
||||||
|
int c = zzReader.read();
|
||||||
|
if (c == -1) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
zzBuffer[zzEndRead++] = (char) c;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// numRead < 0
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the input stream.
|
||||||
|
*/
|
||||||
|
public final void yyclose() throws java.io.IOException {
|
||||||
|
zzAtEOF = true; /* indicate end of file */
|
||||||
|
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||||
|
|
||||||
|
if (zzReader != null)
|
||||||
|
zzReader.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the scanner to read from a new input stream.
|
||||||
|
* Does not close the old reader.
|
||||||
|
*
|
||||||
|
* All internal variables are reset, the old input stream
|
||||||
|
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||||
|
* Lexical state is set to <tt>ZZ_INITIAL</tt>.
|
||||||
|
*
|
||||||
|
* @param reader the new input stream
|
||||||
|
*/
|
||||||
|
public final void yyreset(java.io.Reader reader) {
|
||||||
|
zzReader = reader;
|
||||||
|
zzAtBOL = true;
|
||||||
|
zzAtEOF = false;
|
||||||
|
zzEndRead = zzStartRead = 0;
|
||||||
|
zzCurrentPos = zzMarkedPos = 0;
|
||||||
|
yyline = yychar = yycolumn = 0;
|
||||||
|
zzLexicalState = YYINITIAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current lexical state.
|
||||||
|
*/
|
||||||
|
public final int yystate() {
|
||||||
|
return zzLexicalState;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enters a new lexical state
|
||||||
|
*
|
||||||
|
* @param newState the new lexical state
|
||||||
|
*/
|
||||||
|
public final void yybegin(int newState) {
|
||||||
|
zzLexicalState = newState;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the text matched by the current regular expression.
|
||||||
|
*/
|
||||||
|
public final String yytext() {
|
||||||
|
return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the character at position <tt>pos</tt> from the
|
||||||
|
* matched text.
|
||||||
|
*
|
||||||
|
* It is equivalent to yytext().charAt(pos), but faster
|
||||||
|
*
|
||||||
|
* @param pos the position of the character to fetch.
|
||||||
|
* A value from 0 to yylength()-1.
|
||||||
|
*
|
||||||
|
* @return the character at position pos
|
||||||
|
*/
|
||||||
|
public final char yycharat(int pos) {
|
||||||
|
return zzBuffer[zzStartRead+pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the length of the matched text region.
|
||||||
|
*/
|
||||||
|
public final int yylength() {
|
||||||
|
return zzMarkedPos-zzStartRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reports an error that occured while scanning.
|
||||||
|
*
|
||||||
|
* In a wellformed scanner (no or only correct usage of
|
||||||
|
* yypushback(int) and a match-all fallback rule) this method
|
||||||
|
* will only be called with things that "Can't Possibly Happen".
|
||||||
|
* If this method is called, something is seriously wrong
|
||||||
|
* (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||||
|
*
|
||||||
|
* Usual syntax/scanner level error handling should be done
|
||||||
|
* in error fallback rules.
|
||||||
|
*
|
||||||
|
* @param errorCode the code of the errormessage to display
|
||||||
|
*/
|
||||||
|
private void zzScanError(int errorCode) {
|
||||||
|
String message;
|
||||||
|
try {
|
||||||
|
message = ZZ_ERROR_MSG[errorCode];
|
||||||
|
}
|
||||||
|
catch (ArrayIndexOutOfBoundsException e) {
|
||||||
|
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pushes the specified amount of characters back into the input stream.
|
||||||
|
*
|
||||||
|
* They will be read again by then next call of the scanning method
|
||||||
|
*
|
||||||
|
* @param number the number of characters to be read again.
|
||||||
|
* This number must not be greater than yylength()!
|
||||||
|
*/
|
||||||
|
public void yypushback(int number) {
|
||||||
|
if ( number > yylength() )
|
||||||
|
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||||
|
|
||||||
|
zzMarkedPos -= number;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resumes scanning until the next regular expression is matched,
|
||||||
|
* the end of input is encountered or an I/O-Error occurs.
|
||||||
|
*
|
||||||
|
* @return the next token
|
||||||
|
* @exception java.io.IOException if any I/O-Error occurs
|
||||||
|
*/
|
||||||
|
public Yytoken yylex() throws java.io.IOException {
|
||||||
|
int zzInput;
|
||||||
|
int zzAction;
|
||||||
|
|
||||||
|
// cached fields:
|
||||||
|
int zzCurrentPosL;
|
||||||
|
int zzMarkedPosL;
|
||||||
|
int zzEndReadL = zzEndRead;
|
||||||
|
char [] zzBufferL = zzBuffer;
|
||||||
|
char [] zzCMapL = ZZ_CMAP;
|
||||||
|
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
zzMarkedPosL = zzMarkedPos;
|
||||||
|
|
||||||
|
zzAction = -1;
|
||||||
|
|
||||||
|
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||||
|
|
||||||
|
zzState = ZZ_LEXSTATE[zzLexicalState];
|
||||||
|
|
||||||
|
|
||||||
|
zzForAction: {
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
if (zzCurrentPosL < zzEndReadL)
|
||||||
|
zzInput = zzBufferL[zzCurrentPosL++];
|
||||||
|
else if (zzAtEOF) {
|
||||||
|
zzInput = YYEOF;
|
||||||
|
break zzForAction;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// store back cached positions
|
||||||
|
zzCurrentPos = zzCurrentPosL;
|
||||||
|
zzMarkedPos = zzMarkedPosL;
|
||||||
|
boolean eof = zzRefill();
|
||||||
|
// get translated positions and possibly new buffer
|
||||||
|
zzCurrentPosL = zzCurrentPos;
|
||||||
|
zzMarkedPosL = zzMarkedPos;
|
||||||
|
zzBufferL = zzBuffer;
|
||||||
|
zzEndReadL = zzEndRead;
|
||||||
|
if (eof) {
|
||||||
|
zzInput = YYEOF;
|
||||||
|
break zzForAction;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
zzInput = zzBufferL[zzCurrentPosL++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
zzInput = zzCMapL[zzInput];
|
||||||
|
|
||||||
|
boolean zzIsFinal = false;
|
||||||
|
boolean zzNoLookAhead = false;
|
||||||
|
|
||||||
|
zzForNext: { switch (zzState) {
|
||||||
|
case 0:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 2: zzState = 2; break zzForNext;
|
||||||
|
case 3: zzIsFinal = true; zzState = 3; break zzForNext;
|
||||||
|
case 7:
|
||||||
|
case 17: zzIsFinal = true; zzNoLookAhead = true; zzState = 4; break zzForNext;
|
||||||
|
case 9: zzIsFinal = true; zzNoLookAhead = true; zzState = 5; break zzForNext;
|
||||||
|
case 12: zzState = 6; break zzForNext;
|
||||||
|
case 13: zzState = 7; break zzForNext;
|
||||||
|
case 15: zzState = 8; break zzForNext;
|
||||||
|
case 22: zzIsFinal = true; zzNoLookAhead = true; zzState = 9; break zzForNext;
|
||||||
|
case 23: zzIsFinal = true; zzNoLookAhead = true; zzState = 10; break zzForNext;
|
||||||
|
case 24: zzIsFinal = true; zzNoLookAhead = true; zzState = 11; break zzForNext;
|
||||||
|
case 25: zzIsFinal = true; zzNoLookAhead = true; zzState = 12; break zzForNext;
|
||||||
|
case 26: zzIsFinal = true; zzNoLookAhead = true; zzState = 13; break zzForNext;
|
||||||
|
case 27: zzIsFinal = true; zzNoLookAhead = true; zzState = 14; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 8: zzIsFinal = true; zzState = 16; break zzForNext;
|
||||||
|
case 9: zzIsFinal = true; zzNoLookAhead = true; zzState = 17; break zzForNext;
|
||||||
|
case 17: break zzForAction;
|
||||||
|
default: zzIsFinal = true; zzNoLookAhead = true; zzState = 15; break zzForNext;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 3: zzIsFinal = true; zzState = 3; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 3: zzIsFinal = true; break zzForNext;
|
||||||
|
case 4: zzState = 18; break zzForNext;
|
||||||
|
case 5:
|
||||||
|
case 18: zzState = 19; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 19: zzState = 20; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 16: zzState = 21; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 14: zzState = 22; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 8: zzIsFinal = true; zzNoLookAhead = true; zzState = 23; break zzForNext;
|
||||||
|
case 9: zzIsFinal = true; zzNoLookAhead = true; zzState = 24; break zzForNext;
|
||||||
|
case 10: zzIsFinal = true; zzNoLookAhead = true; zzState = 25; break zzForNext;
|
||||||
|
case 11: zzIsFinal = true; zzNoLookAhead = true; zzState = 26; break zzForNext;
|
||||||
|
case 12: zzIsFinal = true; zzNoLookAhead = true; zzState = 27; break zzForNext;
|
||||||
|
case 13: zzIsFinal = true; zzNoLookAhead = true; zzState = 28; break zzForNext;
|
||||||
|
case 14: zzIsFinal = true; zzNoLookAhead = true; zzState = 29; break zzForNext;
|
||||||
|
case 15: zzIsFinal = true; zzNoLookAhead = true; zzState = 30; break zzForNext;
|
||||||
|
case 16: zzState = 31; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 18:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 3: zzIsFinal = true; zzState = 32; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 19:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 2:
|
||||||
|
case 6: zzState = 33; break zzForNext;
|
||||||
|
case 3: zzIsFinal = true; zzState = 34; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 20:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 20: zzState = 35; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 21:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 20: zzState = 36; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 22:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 16: zzState = 37; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 31:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 1:
|
||||||
|
case 3:
|
||||||
|
case 5:
|
||||||
|
case 11:
|
||||||
|
case 12:
|
||||||
|
case 18:
|
||||||
|
case 19: zzState = 38; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 32:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 5:
|
||||||
|
case 18: zzState = 19; break zzForNext;
|
||||||
|
case 3: zzIsFinal = true; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 33:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 3: zzIsFinal = true; zzState = 34; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 34:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 3: zzIsFinal = true; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 35:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 21: zzState = 37; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 36:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 20: zzIsFinal = true; zzNoLookAhead = true; zzState = 39; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 37:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 18: zzIsFinal = true; zzNoLookAhead = true; zzState = 40; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 38:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 1:
|
||||||
|
case 3:
|
||||||
|
case 5:
|
||||||
|
case 11:
|
||||||
|
case 12:
|
||||||
|
case 18:
|
||||||
|
case 19: zzState = 41; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 41:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 1:
|
||||||
|
case 3:
|
||||||
|
case 5:
|
||||||
|
case 11:
|
||||||
|
case 12:
|
||||||
|
case 18:
|
||||||
|
case 19: zzState = 42; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 42:
|
||||||
|
switch (zzInput) {
|
||||||
|
case 1:
|
||||||
|
case 3:
|
||||||
|
case 5:
|
||||||
|
case 11:
|
||||||
|
case 12:
|
||||||
|
case 18:
|
||||||
|
case 19: zzIsFinal = true; zzNoLookAhead = true; zzState = 43; break zzForNext;
|
||||||
|
default: break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
// if this is ever reached, there is a serious bug in JFlex
|
||||||
|
zzScanError(ZZ_UNKNOWN_ERROR);
|
||||||
|
break;
|
||||||
|
} }
|
||||||
|
|
||||||
|
if ( zzIsFinal ) {
|
||||||
|
zzAction = zzState;
|
||||||
|
zzMarkedPosL = zzCurrentPosL;
|
||||||
|
if ( zzNoLookAhead ) break zzForAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// store back cached position
|
||||||
|
zzMarkedPos = zzMarkedPosL;
|
||||||
|
|
||||||
|
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||||
|
case 10:
|
||||||
|
{ sb.append(yytext());
|
||||||
|
}
|
||||||
|
case 24: break;
|
||||||
|
case 3:
|
||||||
|
{ sb.clear();yybegin(STRING_BEGIN);
|
||||||
|
}
|
||||||
|
case 25: break;
|
||||||
|
case 15:
|
||||||
|
{ sb.append('\b');
|
||||||
|
}
|
||||||
|
case 26: break;
|
||||||
|
case 5:
|
||||||
|
{ return new Yytoken(Yytoken.TYPE_RIGHT_BRACE,null);
|
||||||
|
}
|
||||||
|
case 27: break;
|
||||||
|
case 12:
|
||||||
|
{ sb.append('\\');
|
||||||
|
}
|
||||||
|
case 28: break;
|
||||||
|
case 20:
|
||||||
|
{ Double val=Double.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE,val);
|
||||||
|
}
|
||||||
|
case 29: break;
|
||||||
|
case 1:
|
||||||
|
{ Long val=Long.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE,val);
|
||||||
|
}
|
||||||
|
case 30: break;
|
||||||
|
case 7:
|
||||||
|
{ return new Yytoken(Yytoken.TYPE_RIGHT_SQUARE,null);
|
||||||
|
}
|
||||||
|
case 31: break;
|
||||||
|
case 18:
|
||||||
|
{ sb.append('\r');
|
||||||
|
}
|
||||||
|
case 32: break;
|
||||||
|
case 21:
|
||||||
|
{ return new Yytoken(Yytoken.TYPE_VALUE,null);
|
||||||
|
}
|
||||||
|
case 33: break;
|
||||||
|
case 14:
|
||||||
|
{ sb.append('/');
|
||||||
|
}
|
||||||
|
case 34: break;
|
||||||
|
case 9:
|
||||||
|
{ return new Yytoken(Yytoken.TYPE_COLON,null);
|
||||||
|
}
|
||||||
|
case 35: break;
|
||||||
|
case 11:
|
||||||
|
{ yybegin(YYINITIAL);return new Yytoken(Yytoken.TYPE_VALUE,sb.toString());
|
||||||
|
}
|
||||||
|
case 36: break;
|
||||||
|
case 13:
|
||||||
|
{ sb.append('"');
|
||||||
|
}
|
||||||
|
case 37: break;
|
||||||
|
case 4:
|
||||||
|
{ return new Yytoken(Yytoken.TYPE_LEFT_BRACE,null);
|
||||||
|
}
|
||||||
|
case 38: break;
|
||||||
|
case 16:
|
||||||
|
{ sb.append('\f');
|
||||||
|
}
|
||||||
|
case 39: break;
|
||||||
|
case 19:
|
||||||
|
{ sb.append('\t');
|
||||||
|
}
|
||||||
|
case 40: break;
|
||||||
|
case 6:
|
||||||
|
{ return new Yytoken(Yytoken.TYPE_LEFT_SQUARE,null);
|
||||||
|
}
|
||||||
|
case 41: break;
|
||||||
|
case 23:
|
||||||
|
{ int ch=Integer.parseInt(yytext().substring(2),16);
|
||||||
|
sb.append((char)ch);
|
||||||
|
}
|
||||||
|
case 42: break;
|
||||||
|
case 22:
|
||||||
|
{ Boolean val=Boolean.valueOf(yytext()); return new Yytoken(Yytoken.TYPE_VALUE,val);
|
||||||
|
}
|
||||||
|
case 43: break;
|
||||||
|
case 17:
|
||||||
|
{ sb.append('\n');
|
||||||
|
}
|
||||||
|
case 44: break;
|
||||||
|
case 8:
|
||||||
|
{ return new Yytoken(Yytoken.TYPE_COMMA,null);
|
||||||
|
}
|
||||||
|
case 45: break;
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
}
|
||||||
|
case 46: break;
|
||||||
|
default:
|
||||||
|
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||||
|
zzAtEOF = true;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
zzScanError(ZZ_NO_MATCH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
31
src/org/json/simple/parser/Yytoken.java
Normal file
31
src/org/json/simple/parser/Yytoken.java
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* $Id: Yytoken.java,v 1.1 2006/04/15 14:10:48 platform Exp $
|
||||||
|
* Created on 2006-4-15
|
||||||
|
*/
|
||||||
|
package org.json.simple.parser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||||
|
*/
|
||||||
|
public class Yytoken {
|
||||||
|
public static final int TYPE_VALUE=0;//JSON primitive value: string,number,boolean,null
|
||||||
|
public static final int TYPE_LEFT_BRACE=1;
|
||||||
|
public static final int TYPE_RIGHT_BRACE=2;
|
||||||
|
public static final int TYPE_LEFT_SQUARE=3;
|
||||||
|
public static final int TYPE_RIGHT_SQUARE=4;
|
||||||
|
public static final int TYPE_COMMA=5;
|
||||||
|
public static final int TYPE_COLON=6;
|
||||||
|
public static final int TYPE_EOF=-1;//end of file
|
||||||
|
|
||||||
|
public int type=0;
|
||||||
|
public Object value=null;
|
||||||
|
|
||||||
|
public Yytoken(int type,Object value){
|
||||||
|
this.type=type;
|
||||||
|
this.value=value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
return String.valueOf(type+"=>|"+value+"|");
|
||||||
|
}
|
||||||
|
}
|
||||||
12
src/org/json/simple/rope/Node.java
Normal file
12
src/org/json/simple/rope/Node.java
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package org.json.simple.rope;
|
||||||
|
|
||||||
|
class Node {
|
||||||
|
static final int TYPE_STR = 0;
|
||||||
|
static final int TYPE_CH = 1;
|
||||||
|
static final int TYPE_UNKNOWN = -1;
|
||||||
|
|
||||||
|
int type = TYPE_UNKNOWN;
|
||||||
|
Node next;
|
||||||
|
char content_ch;
|
||||||
|
String content_str;
|
||||||
|
}
|
||||||
68
src/org/json/simple/rope/Rope.java
Normal file
68
src/org/json/simple/rope/Rope.java
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
package org.json.simple.rope;
|
||||||
|
|
||||||
|
public class Rope {
|
||||||
|
private Node first;
|
||||||
|
private Node current;
|
||||||
|
private int count = 0;
|
||||||
|
|
||||||
|
public void clear(){
|
||||||
|
count = 0;
|
||||||
|
first = null;
|
||||||
|
current = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int length(){
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString(){
|
||||||
|
if(count == 0)
|
||||||
|
return "";
|
||||||
|
|
||||||
|
char[] chs = new char[count];
|
||||||
|
int pos = 0;
|
||||||
|
|
||||||
|
Node p = first;
|
||||||
|
do{
|
||||||
|
if(p.type == Node.TYPE_CH){
|
||||||
|
chs[pos] = p.content_ch;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
int len = p.content_str.length();
|
||||||
|
p.content_str.getChars(0, len, chs, pos);
|
||||||
|
pos += len;
|
||||||
|
}
|
||||||
|
p = p.next;
|
||||||
|
}while(p != null);
|
||||||
|
|
||||||
|
return new String(chs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void append(char ch){
|
||||||
|
Node node = new Node();
|
||||||
|
node.type = Node.TYPE_CH;
|
||||||
|
node.content_ch = ch;
|
||||||
|
if(first == null)
|
||||||
|
first = node;
|
||||||
|
if(current != null)
|
||||||
|
current.next = node;
|
||||||
|
current = node;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void append(String s){
|
||||||
|
if(s == null || s.equals(""))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Node node = new Node();
|
||||||
|
node.type = Node.TYPE_STR;
|
||||||
|
node.content_str = s;
|
||||||
|
if(first == null)
|
||||||
|
first = node;
|
||||||
|
if(current != null)
|
||||||
|
current.next = node;
|
||||||
|
current = node;
|
||||||
|
count += s.length();
|
||||||
|
}
|
||||||
|
}
|
||||||
1
svn-commit.tmp
Normal file
1
svn-commit.tmp
Normal file
@@ -0,0 +1 @@
|
|||||||
|
init
|
||||||
49
test.xml
Normal file
49
test.xml
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<project name="json-simple" default="main" basedir=".">
|
||||||
|
<path id="runtime.path">
|
||||||
|
<fileset dir="lib">
|
||||||
|
<include name="*.jar"/>
|
||||||
|
</fileset>
|
||||||
|
<pathelement location="build/test"/>
|
||||||
|
</path>
|
||||||
|
|
||||||
|
<path id="compile.path">
|
||||||
|
<fileset dir="lib">
|
||||||
|
<include name="*.jar"/>
|
||||||
|
</fileset>
|
||||||
|
</path>
|
||||||
|
|
||||||
|
<target name="main" depends="mkdir,compile,junit">
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="clean">
|
||||||
|
<delete includeemptydirs="true">
|
||||||
|
<fileset dir="build/test" includes="**/*"/>
|
||||||
|
<fileset dir="." includes="TEST-*.txt"/>
|
||||||
|
</delete>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="mkdir">
|
||||||
|
<mkdir dir="build/test"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="compile">
|
||||||
|
<javac srcdir="test"
|
||||||
|
destdir="build/test"
|
||||||
|
includes="**/*.java"
|
||||||
|
encoding="UTF-8"
|
||||||
|
target="1.2"
|
||||||
|
source="1.2">
|
||||||
|
<classpath refid="compile.path"/>
|
||||||
|
</javac>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="junit">
|
||||||
|
<junit>
|
||||||
|
<classpath refid="runtime.path"/>
|
||||||
|
<formatter type="plain"/>
|
||||||
|
<test name="org.json.simple.Test"/>
|
||||||
|
<test name="org.json.simple.parser.YylexTest"/>
|
||||||
|
<test name="org.json.simple.rope.RopeTest"/>
|
||||||
|
</junit>
|
||||||
|
</target>
|
||||||
|
</project>
|
||||||
75
test/org/json/simple/Test.java
Normal file
75
test/org/json/simple/Test.java
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* $Id: Test.java,v 1.1 2006/04/15 14:40:06 platform Exp $
|
||||||
|
* Created on 2006-4-15
|
||||||
|
*/
|
||||||
|
package org.json.simple;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||||
|
*/
|
||||||
|
public class Test extends TestCase{
|
||||||
|
|
||||||
|
public void testDecode() throws Exception{
|
||||||
|
System.out.println("=======decode=======");
|
||||||
|
|
||||||
|
String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
|
||||||
|
Object obj=JSONValue.parse(s);
|
||||||
|
JSONArray array=(JSONArray)obj;
|
||||||
|
System.out.println("======the 2nd element of array======");
|
||||||
|
System.out.println(array.get(1));
|
||||||
|
System.out.println();
|
||||||
|
assertEquals("{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}",array.get(1).toString());
|
||||||
|
|
||||||
|
JSONObject obj2=(JSONObject)array.get(1);
|
||||||
|
System.out.println("======field \"1\"==========");
|
||||||
|
System.out.println(obj2.get("1"));
|
||||||
|
assertEquals("{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}",obj2.get("1").toString());
|
||||||
|
|
||||||
|
s="{}";
|
||||||
|
obj=JSONValue.parse(s);
|
||||||
|
assertEquals("{}",obj.toString());
|
||||||
|
|
||||||
|
s="[5,]";
|
||||||
|
obj=JSONValue.parse(s);
|
||||||
|
assertEquals("[5]",obj.toString());
|
||||||
|
|
||||||
|
s="[5,,2]";
|
||||||
|
obj=JSONValue.parse(s);
|
||||||
|
assertEquals("[5,2]",obj.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testEncode() throws Exception{
|
||||||
|
System.out.println("=======encode=======");
|
||||||
|
|
||||||
|
JSONArray array1=new JSONArray();
|
||||||
|
array1.add("abc\u0010a/");
|
||||||
|
array1.add(new Integer(123));
|
||||||
|
array1.add(new Double(222.123));
|
||||||
|
array1.add(new Boolean(true));
|
||||||
|
System.out.println("======array1==========");
|
||||||
|
System.out.println(array1);
|
||||||
|
System.out.println();
|
||||||
|
assertEquals("[\"abc\\u0010a\\/\",123,222.123,true]",array1.toString());
|
||||||
|
|
||||||
|
JSONObject obj1=new JSONObject();
|
||||||
|
obj1.put("name","fang");
|
||||||
|
obj1.put("age",new Integer(27));
|
||||||
|
obj1.put("is_developer",new Boolean(true));
|
||||||
|
obj1.put("weight",new Double(60.21));
|
||||||
|
obj1.put("array1",array1);
|
||||||
|
System.out.println("======obj1 with array1===========");
|
||||||
|
System.out.println(obj1);
|
||||||
|
System.out.println();
|
||||||
|
assertEquals("{\"array1\":[\"abc\\u0010a\\/\",123,222.123,true],\"weight\":60.21,\"age\":27,\"name\":\"fang\",\"is_developer\":true}",obj1.toString());
|
||||||
|
|
||||||
|
obj1.remove("array1");
|
||||||
|
array1.add(obj1);
|
||||||
|
System.out.println("======array1 with obj1========");
|
||||||
|
System.out.println(array1);
|
||||||
|
System.out.println();
|
||||||
|
assertEquals("[\"abc\\u0010a\\/\",123,222.123,true,{\"weight\":60.21,\"age\":27,\"name\":\"fang\",\"is_developer\":true}]",array1.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
52
test/org/json/simple/parser/YylexTest.java
Normal file
52
test/org/json/simple/parser/YylexTest.java
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
package org.json.simple.parser;
|
||||||
|
|
||||||
|
import java.io.StringReader;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
public class YylexTest extends TestCase {
|
||||||
|
|
||||||
|
public void testYylex() throws Exception{
|
||||||
|
String s="\"\\/\"";
|
||||||
|
System.out.println(s);
|
||||||
|
StringReader in = new StringReader(s);
|
||||||
|
Yylex lexer=new Yylex(in);
|
||||||
|
Yytoken token=lexer.yylex();
|
||||||
|
assertEquals(Yytoken.TYPE_VALUE,token.type);
|
||||||
|
assertEquals("/",token.value);
|
||||||
|
|
||||||
|
s="\"abc\\/\\r\\b\\n\\t\\f\\\\\"";
|
||||||
|
System.out.println(s);
|
||||||
|
in = new StringReader(s);
|
||||||
|
lexer=new Yylex(in);
|
||||||
|
token=lexer.yylex();
|
||||||
|
assertEquals(Yytoken.TYPE_VALUE,token.type);
|
||||||
|
assertEquals("abc/\r\b\n\t\f\\",token.value);
|
||||||
|
|
||||||
|
s="[\t \n\r\n{ \t \t\n\r}";
|
||||||
|
System.out.println(s);
|
||||||
|
in = new StringReader(s);
|
||||||
|
lexer=new Yylex(in);
|
||||||
|
token=lexer.yylex();
|
||||||
|
assertEquals(Yytoken.TYPE_LEFT_SQUARE,token.type);
|
||||||
|
token=lexer.yylex();
|
||||||
|
assertEquals(Yytoken.TYPE_LEFT_BRACE,token.type);
|
||||||
|
token=lexer.yylex();
|
||||||
|
assertEquals(Yytoken.TYPE_RIGHT_BRACE,token.type);
|
||||||
|
|
||||||
|
s="\b\f{";
|
||||||
|
System.out.println(s);
|
||||||
|
in = new StringReader(s);
|
||||||
|
lexer=new Yylex(in);
|
||||||
|
Error err=null;
|
||||||
|
try{
|
||||||
|
token=lexer.yylex();
|
||||||
|
}
|
||||||
|
catch(Error e){
|
||||||
|
err=e;
|
||||||
|
System.out.println("error:"+err);
|
||||||
|
}
|
||||||
|
assertTrue(err!=null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
44
test/org/json/simple/rope/RopeTest.java
Normal file
44
test/org/json/simple/rope/RopeTest.java
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package org.json.simple.rope;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
public class RopeTest extends TestCase {
|
||||||
|
public void testOpts(){
|
||||||
|
Rope rope = new Rope();
|
||||||
|
|
||||||
|
assertEquals("",rope.toString());
|
||||||
|
assertEquals(0,rope.length());
|
||||||
|
|
||||||
|
rope.append('c');
|
||||||
|
assertEquals("c",rope.toString());
|
||||||
|
assertEquals(1,rope.length());
|
||||||
|
|
||||||
|
rope.append("fang");
|
||||||
|
assertEquals("cfang",rope.toString());
|
||||||
|
assertEquals(5,rope.length());
|
||||||
|
|
||||||
|
rope.append('1');
|
||||||
|
assertEquals("cfang1",rope.toString());
|
||||||
|
assertEquals(6,rope.length());
|
||||||
|
|
||||||
|
rope.append("你好");
|
||||||
|
assertEquals("cfang1你好",rope.toString());
|
||||||
|
assertEquals(8,rope.length());
|
||||||
|
|
||||||
|
rope.append('世');
|
||||||
|
assertEquals("cfang1你好世",rope.toString());
|
||||||
|
assertEquals(9,rope.length());
|
||||||
|
|
||||||
|
rope.append("界");
|
||||||
|
assertEquals("cfang1你好世界",rope.toString());
|
||||||
|
assertEquals(10,rope.length());
|
||||||
|
|
||||||
|
rope.append("");
|
||||||
|
assertEquals("cfang1你好世界",rope.toString());
|
||||||
|
assertEquals(10,rope.length());
|
||||||
|
|
||||||
|
rope.clear();
|
||||||
|
assertEquals("",rope.toString());
|
||||||
|
assertEquals(0,rope.length());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user