Android学習ノートのJSONのシーケンス化の基本的な使い方

49081 ワード

最近、どのように1つのデータオブジェクトをWCFを通じてサーバーに伝えることができるかを探しています.ネット上で1つのオブジェクトがJSONのデータフォーマットにシーケンス化された投稿を見ました.ここで整理します.
JSONのJSOnStringerというクラスを使用していますが、このような主な機能は、1つのデータ型をすばやくシーケンス化し、標準的なJSONデータにすることです.
ここで注意しなければならないのは、
.object()と.endObject()は、Object基準に従って数値に境界を追加するために同時に使用する必要があります.同様に、配列に対しても境界を生成するための標準的な方法のセットがある.Array()と.endArray().
基本原理としては,データの入力がどのタイプに属するかを判断し,具体的なタイプ(オブジェクト,配列,集合,Map,Stringなどの単一の基礎データ型)に基づいてシーケンス化することである.
私はオブジェクトを列にしています.
一、データオブジェクト
 1 public class ListInfoObj {

 2 

 3     private List<String> Names;

 4     private List<String> Sixs;

 5 

 6     public List<String> getNames() {

 7         return Names;

 8     }

 9 

10     public void setNames(List<String> names) {

11         Names = names;

12     }

13 

14     public List<String> getSixs() {

15         return Sixs;

16     }

17 

18     public void setSixs(List<String> sixs) {

19         Sixs = sixs;

20     }

二、メインインタフェース(オブジェクトを初期化し、値を付与する)呼び出しシーケンス化方法
 1 public class MainActivity extends Activity {

 2     private Button toJsonBut;

 3     private TextView msgView;

 4     private ListInfoObj mListInfoObj;

 5 

 6     @Override

 7     protected void onCreate(Bundle savedInstanceState) {

 8         super.onCreate(savedInstanceState);

 9         setContentView(R.layout.activity_main);

10         this.toJsonBut = (Button) this.findViewById(R.id.tojson);

11         this.msgView = (TextView) this.findViewById(R.id.msg);

12         this.toJsonBut.setOnClickListener(listener);

13     }

14 

15     View.OnClickListener listener = new View.OnClickListener() {

16 

17         @Override

18         public void onClick(View v) {

19             // TODO Auto-generated method stub

20             String jsonList;

21             //        

22             getObj();

23             //     

24             ObjtoJson blObjtoJson = new ObjtoJson();

25             jsonList = blObjtoJson.toJson(mListInfoObj);

26             //    

27             msgView.setText(jsonList);

28 

29         }

30     };

31 

32     /**

33      *        

34      */

35     private void getObj() {    

36         this.mListInfoObj = new ListInfoObj();

37         List<String> name = new ArrayList<String>();

38         name.add("  ");

39         name.add("  ");

40         name.add("  ");

41         List<String> six = new ArrayList<String>();

42         six.add(" ");

43         six.add(" ");

44         six.add(" ");

45         this.mListInfoObj.setNames(name);

46         this.mListInfoObj.setSixs(six);

47     }

三、JSONシーケンス化(これこそメイン料理)
  1 public class ObjtoJson {

  2 

  3     public String toJson(Object obj) {

  4         String jsonStr = null;

  5         //    JSONStringer  

  6         JSONStringer js = new JSONStringer();

  7         //       

  8         serialize(js, obj);

  9         //      

 10         jsonStr = js.toString();

 11         return jsonStr;

 12     }

 13 

 14     /**

 15      *               

 16      * @param js

 17      * @param obj         

 18      */

 19     private static void serialize(JSONStringer js, Object obj) {

 20         //      

 21         if (isNull(obj)) {

 22             try {

 23                 js.value(null);

 24             } catch (Exception e) {

 25                 // TODO: handle exception

 26                 Log.i("js    ", e.toString());

 27             }

 28         }

 29         Class<?> clazz = obj.getClass();

 30         if (isObject(clazz)) { //   

 31             serializeObject(js, obj);

 32         } else if (isArray(clazz)) { //   

 33             serializeArray(js, obj);

 34         } else if (isCollection(clazz)) { //   

 35             Collection<?> collection = (Collection<?>) obj;

 36             serializeCollect(js, collection);

 37         } else if (isMap(clazz)) { //   

 38             HashMap<?, ?> collection = (HashMap<?, ?>) obj;

 39             serializeMap(js, collection);

 40         } else { //    

 41             try {

 42                 js.value(obj);

 43             } catch (JSONException e) {

 44                 e.printStackTrace();

 45             }

 46         }

 47 

 48     }

 49 

 50     /**

 51      *      

 52      * 

 53      * @param js

 54      *            json  

 55      * @param array

 56      *              

 57      */

 58     private static void serializeArray(JSONStringer js, Object array) {

 59         try {

 60             js.array();

 61             for (int i = 0; i < Array.getLength(array); ++i) {

 62                 Object o = Array.get(array, i);

 63                 //       

 64                 serialize(js, o);

 65             }

 66             js.endArray();

 67         } catch (Exception e) {

 68             e.printStackTrace();

 69         }

 70     }

 71 

 72     /**

 73      *      

 74      * 

 75      * @param js

 76      *            json  

 77      * @param collection

 78      *              

 79      */

 80     private static void serializeCollect(JSONStringer js,

 81             Collection<?> collection) {

 82         try {

 83             js.array();

 84             for (Object o : collection) {

 85                 serialize(js, o);

 86             }

 87             js.endArray();

 88         } catch (Exception e) {

 89             e.printStackTrace();

 90         }

 91     }

 92 

 93     /**

 94      *    Map

 95      * 

 96      * @param js

 97      *            json  

 98      * @param map

 99      *            map  

100      */

101     private static void serializeMap(JSONStringer js, Map<?, ?> map) {

102         try {

103             js.object();

104             @SuppressWarnings("unchecked")

105             Map<String, Object> valueMap = (Map<String, Object>) map;

106             Iterator<Map.Entry<String, Object>> it = valueMap.entrySet()

107                     .iterator();

108             while (it.hasNext()) {

109                 Map.Entry<String, Object> entry = (Map.Entry<String, Object>) it

110                         .next();

111                 js.key(entry.getKey());

112                 serialize(js, entry.getValue());

113             }

114             js.endObject();

115         } catch (Exception e) {

116             e.printStackTrace();

117         }

118     }

119     

120     /**

121      *      

122      * 

123      * @param js

124      *            json  

125      * @param obj

126      *                  

127      */

128     private static void serializeObject(JSONStringer js, Object obj) {

129         try {

130             js.object();

131             Class<? extends Object> objClazz = obj.getClass();

132             Method[] methods = objClazz.getDeclaredMethods();

133             Field[] fields = objClazz.getDeclaredFields();

134             for (Field field : fields) {

135                 try {

136                     String fieldType = field.getType().getSimpleName();

137                     String fieldGetName = parseMethodName(field.getName(),

138                             "get");

139                     if (!haveMethod(methods, fieldGetName)) {

140                         continue;

141                     }

142                     Method fieldGetMet = objClazz.getMethod(fieldGetName,

143                             new Class[] {});

144                     Object fieldVal = fieldGetMet.invoke(obj, new Object[] {});

145                     String result = null;

146                     if ("Date".equals(fieldType)) {

147                         SimpleDateFormat sdf = new SimpleDateFormat(

148                                 "yyyy-MM-dd HH:mm:ss", Locale.US);

149                         result = sdf.format((Date) fieldVal);

150 

151                     } else {

152                         if (null != fieldVal) {

153                             result = String.valueOf(fieldVal);

154                         }

155                     }

156                     js.key(field.getName());

157                     serialize(js, result);

158                 } catch (Exception e) {

159                     continue;

160                 }

161             }

162             js.endObject();

163         } catch (Exception e) {

164             e.printStackTrace();

165         }

166     }

167 

168     /**

169      *            get  

170      * 

171      * @param methods

172      *                   

173      * @param fieldMethod

174      *                

175      * @return true  false

176      */

177     public static boolean haveMethod(Method[] methods, String fieldMethod) {

178         for (Method met : methods) {

179             if (fieldMethod.equals(met.getName())) {

180                 return true;

181             }

182         }

183         return false;

184     }

185 

186     /**

187      *        get  set  

188      * 

189      * @param fieldName

190      *                

191      * @param methodType

192      *                

193      * @return     

194      */

195     public static String parseMethodName(String fieldName, String methodType) {

196         if (null == fieldName || "".equals(fieldName)) {

197             return null;

198         }

199         return methodType + fieldName.substring(0, 1).toUpperCase()

200                 + fieldName.substring(1);

201     }

202 

203     private static boolean isNull(Object obj) {

204         if (obj instanceof JSONObject) {

205             return JSONObject.NULL.equals(obj);

206         }

207         return obj == null;

208     }

209 

210     /**

211      *         

212      * 

213      * @param clazz

214      * @return

215      */

216     private static boolean isSingle(Class<?> clazz) {

217         return isBoolean(clazz) || isNumber(clazz) || isString(clazz);

218     }

219 

220     /**

221      *      

222      * 

223      * @param clazz

224      * @return

225      */

226     public static boolean isBoolean(Class<?> clazz) {

227         return (clazz != null)

228                 && ((Boolean.TYPE.isAssignableFrom(clazz)) || (Boolean.class

229                         .isAssignableFrom(clazz)));

230     }

231 

232     /**

233      *     

234      * 

235      * @param clazz

236      * @return

237      */

238     public static boolean isNumber(Class<?> clazz) {

239         return (clazz != null)

240                 && ((Byte.TYPE.isAssignableFrom(clazz))

241                         || (Short.TYPE.isAssignableFrom(clazz))

242                         || (Integer.TYPE.isAssignableFrom(clazz))

243                         || (Long.TYPE.isAssignableFrom(clazz))

244                         || (Float.TYPE.isAssignableFrom(clazz))

245                         || (Double.TYPE.isAssignableFrom(clazz)) || (Number.class

246                             .isAssignableFrom(clazz)));

247     }

248 

249     /**

250      *         

251      * 

252      * @param clazz

253      * @return

254      */

255     public static boolean isString(Class<?> clazz) {

256         return (clazz != null)

257                 && ((String.class.isAssignableFrom(clazz))

258                         || (Character.TYPE.isAssignableFrom(clazz)) || (Character.class

259                             .isAssignableFrom(clazz)));

260     }

261 

262     /**

263      *        

264      * 

265      * @param clazz

266      * @return

267      */

268     private static boolean isObject(Class<?> clazz) {

269         return clazz != null && !isSingle(clazz) && !isArray(clazz)

270                 && !isCollection(clazz) && !isMap(clazz);

271     }

272 

273     /**

274      *        

275      * 

276      * @param clazz

277      * @return

278      */

279     public static boolean isArray(Class<?> clazz) {

280         return clazz != null && clazz.isArray();

281     }

282 

283     /**

284      *        

285      * 

286      * @param clazz

287      * @return

288      */

289     public static boolean isCollection(Class<?> clazz) {

290         return clazz != null && Collection.class.isAssignableFrom(clazz);

291     }

292 

293     /**

294      *      Map

295      * 

296      * @param clazz

297      * @return

298      */

299     public static boolean isMap(Class<?> clazz) {

300         return clazz != null && Map.class.isAssignableFrom(clazz);

301     }

302 

303     /**

304      *        

305      * 

306      * @param clazz

307      * @return

308      */

309     public static boolean isList(Class<?> clazz) {

310         return clazz != null && List.class.isAssignableFrom(clazz);

311     }

注:中のこれらの方法は具体的に私もどのように言うことを知らないで、自分で试してみて、后で一歩一歩デバッグさせて、中がどのように歩いているのかを见てみるととてもはっきりするはずです.やはり多くの問題を指摘してほしい.学び合う...