publicJSONObject(){
nameValuePairs=newHashMapString,Object>();
再看putOpt 以及put方法:
copy
publicJSONObjectputOpt(Stringname,Objectvalue)throwsJSONException{
if(name==null||value==null){
returnthis;
}
returnput(name,value);
publicJSONObjectput(Stringname,Objectvalue)throwsJSONException{
if(value==null){
nameValuePairs.remove(name);
if(valueinstanceofNumber){
//deviatefromtheoriginalbycheckingallNumbers,notjustfloats&doubles
JSON.checkDouble(((Number)value).doubleValue());
nameValuePairs.put(checkName(name),248)"> returnthis;
这下可明白了吧,其实JSONObject本质是用HashMap实现的,而HashMap是散列的,是链式存储结构。
HashMap的存储过程,根据该元素自身提供的hashcode计算出散列值(在这一点上,就可以知道,元素放进去的位置是无法确定的,只有在获取hashcode后才知道),该值就是数组的下标,然后将该元素放入数组位置的链表中。
那么如何固定它的顺序呢,put进去是我们想要的呢?有两个方法:自定义JSONObject(不用HashMap改用LinkHashMap实现)或使用com.alibaba.fastjson.annotation.JSONType标注
1.自定义JSONObject(不用HashMap改用LinkHashMap实现),LinkedHashMap是有序的,代替无序的HashMap,把父类用到HashMap的地方都改成LinkedHashMap即可,主要是put跟toString的几个方法。
copy
publicclassMyJSONObjectextendsJSONObject{
privateLinkedHashMapObject,0); font-weight:bold; background-color:inherit">>mHashMap;
publicChatMsgJSONObject(){
mHashMap=newLinkedHashMap}
@Override
//TODOAuto-generatedmethodstub
returnput(name,value);
publicJSONObjectput(Stringkey,Objectvalue)throwsJSONException{
if(key==null){
thrownewJSONException("Nullkey.");
if(value!=null){
testValidity(value);
mHashMap.put(key,248)"> }else{
remove(key);
publicObjectremove(Stringkey){
returnmHashMap.remove(key);
staticvoidtestValidity(Objecto)throwsJSONException{
if(o!=null){
if(oinstanceofDouble){
if(((Double)o).isInfinite()||((Double)o).isNaN()){
thrownewJSONException("JSONdoesnotallownon-finitenumbers.");
}elseif(oinstanceofFloat){
if(((Float)o).isInfinite()||((Float)o).isNaN()){
publicStringtoString(){
try{
IteratorObject>keys=mHashMap.keySet().iterator();
StringBuffersb=newStringBuffer("{");
while(keys.hasNext()){
if(sb.length()>1){
sb.append(',');
Objecto=keys.next();
sb.append(quote(o.toString()));
sb.append(':');
sb.append(valueToString(mHashMap.get(o)));
sb.append('}');
returnsb.toString();
}catch(Exceptione){
returnnull;
staticStringvalueToString(Objectvalue)throwsJSONException{
if(value==null||value.equals(null)){
return"null";
if(valueinstanceofJSONStringer){
Objecto;
o=((JSONStringer)value).toString();
}catch(Exceptione){
thrownewJSONException(e.getMessage());
if(oinstanceofString){
return(String)o;
thrownewJSONException("BadvaluefromtoJSONString:"+o);
returnnumberToString((Number)value);
if(valueinstanceofBoolean||valueinstanceofJSONObject||valueinstanceofJSONArray){
returnvalue.toString();
if(valueinstanceofMap){
returnnewJSONObject((Map)value).toString();
if(valueinstanceofCollection){
returnnewJSONArray((Collection)value).toString();
returnquote(value.toString());
}