android 生成json顺序,【Android 一般进阶】固定JSONObject.toString()键值对顺序

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());

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值