简述
开发中不可避免会遇到这样的需求,通过json作为配置文件配置app(比如本地数据库的构建等)。
1.Json格式
假设有这样一个需求:作为配置文件,我们设计了几种奖品用于用户抽奖。
以一个一般的Json格式为例:
{
"filed": true, //配置参数,本例不用只做示范
"rewards": [ //奖品列表
{
"name": "脆脆鲨", //奖品名称
"probability": "0.35", //中奖概率
"image_res": 1, //奖品icon
"reward_serial": "21313133"//奖品serial,用于api请求等
},
{
"name": "东方神牛",
"probability": "0.45",
"image_res": 2,
"reward_serial": "21313134"
},
{
"name": "旺仔牛奶",
"probability": "0.2",
"image_res": 3,
"reward_serial": "21313135"
}
]
}
2.序列化
为了更清楚的描述,我们创建一个Reward类,用来表示这些奖品对象
public class Reward {
public String name;
public float probability;
public int imageResource;
public String serial;
public Reward(String name, float probability, int imageResource, String rewardSerial) {
this.name = name;
this.probability = probability;
this.imageResource = imageResource;
this.Serial = rewardSerial;
}
}
接下来就可以解析json配置文件然后序列化为JsonObject了。
//获取json数据
String rewardJson = "";
String rewardnJsonLine;
//assets文件夹下json文件的路径->打开json文件
BufferedReader bufferedReader = new BufferedReader(newInputStreamReader(context.getAssets().open("db/reward.json")));
while ((rewardJsonLine = bufferedReader.readLine()) != null) {
rewardJson += rewardJsonLine;
}
//序列化json数据
JSONObject jsonObject = new JSONObject(rewardJson);
boolean filed = jsonObject.getBoolean("filed"); //获得配置参数
JSONArray rewards = jsonObject.getJSONArray("rewards");//获得奖品列表
//获得序列化的奖品集合
ArrayList<Reward> list = new ArrayList<>();
//遍历jsonArray,将每个JsonObject转换为对应的Reward对象
for (int i = 0, length = rewards.length(); i < length; i++) {
JSONObject o = rewards.getJSONObject(i);
Reward reward = new Reward(o.getString("name"),
Float.parseFloat(String.valueOf(o.getString("probability"))),
o.getInt("image_res"),
o.getString("reward_serial")
);
probability += reward.probability;
list.add(reward);
}
//接下来就可以处理这些对象了(比如操作数据库,比如通过概率进行抽奖等等)~