Android 如何在JSON和list之间进行转化

走菜 2016-12-15 02:18:29
本人Android 小白一枚, 最近在开发的时候遇到个问题:如何把对象的List类型数据保存成JSON然后从JSON中加载数据。PS:此对象还有其他类型的属性,也需要保存。

代码如下:
public class Project {
private static final String JSON_Name = "projectName";
private static final String JSON_ID = "projectID";
private static final String JSON_POINTS = "projectPoints";

private String projectName;
private UUID projectID;
private ArrayList<KnowPoint> knowPointArrayList;

public Project(String projectName){
projectID = UUID.randomUUID();
this.projectName = projectName;
this.knowPointArrayList = new ArrayList<>();
}

public Project(JSONObject jsonObject) throws JSONException{
projectID = UUID.fromString(jsonObject.getString(JSON_ID));
projectName = jsonObject.getString(JSON_Name);
//TODO
//从JSON数据中得到ArrayList
}

public JSONObject toJSON() throws JSONException{
JSONObject jsonObject = new JSONObject();
jsonObject.put(JSON_Name, projectName);
jsonObject.put(JSON_ID, projectID);
//TODO
//把ArrayList保存到JsonObject中
return jsonObject;
}
}
...全文
1165 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
梅明子 2016-12-17
  • 打赏
  • 举报
回复
这是我的代码,直接拿过来给你参考一下,下面这个方法是把ArrayList数据转换成Json格式字符串的方法

/**
	 * 保存隐藏视频数据(先转换成json,再写入本地文件)
	 * 
	 * @param list
	 */
	public static boolean setVideoHideJson(ArrayList<Video> list) {
		if (list == null) {
			return false;
		}
		L.i("JsonUtil", "保存的隐藏视频数据:" + list.toString());
		try {
			JSONArray array = new JSONArray();
			for (Video ent : list) {
				JSONObject object = new JSONObject();
				object.put("_id", ent.getId());
				object.put("name", ent.getName());
				object.put("duration", ent.getDuration());
				object.put("size", ent.getSize());
				object.put("path", ent.getPath());
				object.put("resolution", ent.getResolution());
				object.put("datetaken", ent.getDatetaken());
				object.put("bucketId", ent.getBucketId());
				object.put("bucketName", ent.getBucketName());
				object.put("width", ent.getWidth());
				object.put("height", ent.getHeight());
				array.put(object);
			}
			return HideFileUtil.saveVideoHideFile(array.toString());
		} catch (JSONException e) {
			e.printStackTrace();
			return false;
		}
	}
后面那里我是把ArrayList数据转换成Json格式的字符串数据用文件的形式写到SD卡的,也就是这个方法(HideFileUtil.saveVideoHideFile(...))当然了你可以把它换成用SharedPreferences保存到本地。然后下面是把Json格式的字符串数据转换成ArrayList

/**
	 * 获取隐藏视频数据(先从本地文件获取json格式数据,再转换成ArrayList)
	 * 
	 * @return
	 */
	public static ArrayList<Video> getVideoHideJson() {
		String json = HideFileUtil.getVideoHideFile();
		if (json == null) {
			return null;
		}
		L.i("JsonUtil", "隐藏的JSON视频数据:" + json);
		try {
			ArrayList<Video> list = new ArrayList<Video>();
			JSONArray array = new JSONArray(json);
			for (int i = 0; i < array.length(); i++) {
				JSONObject object = array.getJSONObject(i);
				Video ent = new Video();
				ent.setId(object.getInt("_id"));
				if (object.has("name")) {
					ent.setName(object.getString("name"));
				}
				ent.setDuration(object.getInt("duration"));
				ent.setSize(object.getLong("size"));
				if (object.has("path")) {
					ent.setPath(object.getString("path"));
				}
				ent.setResolution(object.getLong("resolution"));
				ent.setDatetaken(object.getLong("datetaken"));
				ent.setBucketId(object.getInt("bucketId"));
				if (object.has("bucketName")) {
					ent.setBucketName(object.getString("bucketName"));
				}
				ent.setWidth(object.getInt("width"));
				ent.setHeight(object.getInt("height"));
				list.add(ent);
			}
			L.i("JsonUtil", "隐藏的LIST视频数据:" + list.toString());
			return list;
		} catch (JSONException e) {
			e.printStackTrace();
			return null;
		}
	}
同理,把上面HideFileUtil.getVideoHideFile();可换成SharedPreferences。 最后根据我在实际开发中总结的经验,最好不要用第三方的Json转换包,因为如果后面出了什么问题的话都不好找到原因,最好还是自己写,这样也方便日后维护。
R_ine 2016-12-16
  • 打赏
  • 举报
回复
引用 4 楼 zxayxm 的回复:
[quote=引用 1 楼 R_ine 的回复:] =-=可以将josn转换为String类型,然后String类型和LIst直接转换。就是将list连接成String,然后String转换为list

/**
	 * 将list连接成字符串
	 * 
	 * @param list
	 * @param joiner
	 *            连接字符
	 * @return
	 * @author c99999999 2015-6-27 下午3:08:00
	 * @param <T>
	 * @since v1.0
	 */
	public static <T> String join(List<T> list, String joiner) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i) != null) {
				sb.append(list.get(i).toString());
				if (i < list.size() - 1) {
					sb.append(joiner);
				}
			}
		}
		return sb.toString();
	}
/**
	 * 将字符串转换为List
	 * @param 字符串
	 * @return List
	 */
	public static List getListString(String s)
	{ 
		String subS[] = s.split(",");
		List list = Arrays.asList(subS);  
		return list;
	}


谢谢, 那请问 list 和arraylist之间怎么转化呢?[/quote] 2个不是一样吗。。。。
  • 打赏
  • 举报
回复
百度搜索一下JSONObject和JSONArray的用法
ESC尛蜜蜂 2016-12-16
  • 打赏
  • 举报
回复
Gson 可以看看
走菜 2016-12-15
  • 打赏
  • 举报
回复
引用 1 楼 R_ine 的回复:
=-=可以将josn转换为String类型,然后String类型和LIst直接转换。就是将list连接成String,然后String转换为list

/**
	 * 将list连接成字符串
	 * 
	 * @param list
	 * @param joiner
	 *            连接字符
	 * @return
	 * @author c99999999 2015-6-27 下午3:08:00
	 * @param <T>
	 * @since v1.0
	 */
	public static <T> String join(List<T> list, String joiner) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i) != null) {
				sb.append(list.get(i).toString());
				if (i < list.size() - 1) {
					sb.append(joiner);
				}
			}
		}
		return sb.toString();
	}
/**
	 * 将字符串转换为List
	 * @param 字符串
	 * @return List
	 */
	public static List getListString(String s)
	{ 
		String subS[] = s.split(",");
		List list = Arrays.asList(subS);  
		return list;
	}


谢谢, 那请问 list 和arraylist之间怎么转化呢?
_周星星 2016-12-15
  • 打赏
  • 举报
回复
public class JsonUtil { static Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); public static String toJson(Object obj) { return gson.toJson(obj); } public static Gson getGson() { return gson; } /** * 把json转换为列表 * * @param json * @param className * @return */ public static ArrayList<BaseModel> getDomainList(String json, Class<? extends BaseModel> className) { ArrayList<?> list = JsonUtil.getGson().fromJson(json, new TypeToken<List<?>>() { }.getType() ); String jsonStr = null; ArrayList<BaseModel> baseDomains = new ArrayList<BaseModel>(); BaseModel baseDomain = null; for (int i = 0; i < list.size(); i++) { jsonStr = JsonUtil.toJson(list.get(i)); baseDomain = JsonUtil.getGson().fromJson(jsonStr, className); baseDomains.add(baseDomain); } return baseDomains; } public static BaseModel getDomain(String json, Class<? extends BaseModel> className) { try { BaseModel baseDomain = JsonUtil.getGson().fromJson(json, className); return baseDomain; } catch (Exception e) { e.printStackTrace(); } return null; } }
_周星星 2016-12-15
  • 打赏
  • 举报
回复
这个 不难吧 Gjson 把json转换为实体 实体转换为json
R_ine 2016-12-15
  • 打赏
  • 举报
回复
=-=可以将josn转换为String类型,然后String类型和LIst直接转换。就是将list连接成String,然后String转换为list

/**
	 * 将list连接成字符串
	 * 
	 * @param list
	 * @param joiner
	 *            连接字符
	 * @return
	 * @author c99999999 2015-6-27 下午3:08:00
	 * @param <T>
	 * @since v1.0
	 */
	public static <T> String join(List<T> list, String joiner) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < list.size(); i++) {
			if (list.get(i) != null) {
				sb.append(list.get(i).toString());
				if (i < list.size() - 1) {
					sb.append(joiner);
				}
			}
		}
		return sb.toString();
	}
/**
	 * 将字符串转换为List
	 * @param 字符串
	 * @return List
	 */
	public static List getListString(String s)
	{ 
		String subS[] = s.split(",");
		List list = Arrays.asList(subS);  
		return list;
	}


80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧