皕杰報(bào)表根據(jù)json數(shù)據(jù)自定義數(shù)據(jù)集

如何根據(jù)json數(shù)據(jù)的url、json數(shù)據(jù)里的鍵名玩徊,生成自定義數(shù)據(jù)集并生成皕杰報(bào)表頁(yè)面?

準(zhǔn)備工作:

Demo:jsonurl:https://api.douban.com/v2/movie/top250?start=0&count=10

Json鍵名:name,id,alt

Json字符串解析工具:Fastjson

解決方案:

1.? ? ? ?新建皕杰報(bào)表自定義數(shù)據(jù)集類需要集成bios.report.api.customize.ArrayDataSet類

package? bios.report.dev.examples.dataset;

public class MyJSONDataSet implements ArrayDataSet {

??? //新建數(shù)據(jù)集字段名

??? private static String[] metaData;

??? //新建list存儲(chǔ)Object數(shù)組

??? private static List<Object[]> data =new ArrayList<Object[]>();;

??? @Override

??? //

? 獲取數(shù)據(jù)集中傳遞的參數(shù)值

??? public void applyParams(Object[] arg0) {

??????? //獲取數(shù)據(jù)集傳參的jsonurl

??????? String url = arg0[0].toString();

??????? //獲取數(shù)據(jù)集傳參的鍵名

??????? String fields =arg0[1].toString();

??????? metaData = new String[] {};

??????? //傳遞的鍵名是字符串需要拆分成字符串組

??????? metaData = fields.split(",");


??????? getjSON(url, metaData);

??? }

??? @Override

??? //

? 返回?cái)?shù)據(jù)集字段名

??? public String[]

? getMetaData() {

??????? return metaData;

??? }

??? @Override

??? //

? 返回?cái)?shù)據(jù)集數(shù)據(jù)長(zhǎng)度

??? public int getRowCount() {

??????? return data.size();

??? }

??? @Override

??? //

? 返回?cái)?shù)據(jù)集中指定行的數(shù)據(jù)

??? public Object[] getRowData(int rowIndex) {

??????? return (Object[]) data.get(rowIndex);

??? }

??? //

? 根據(jù)傳遞到URL獲取json數(shù)據(jù)

??? public static void getjSON(String url, String[] fields) {

??????? String res = "";

??????? StringBuffer buffer = new StringBuffer();

??????? try {

??????????? URL urls = new URL(url);

??????????? HttpURLConnection urlCon = (HttpURLConnection)

? urls.openConnection();

??????????? if (200 == urlCon.getResponseCode()) {

??????????????? InputStream is = urlCon.getInputStream();

??????????????? InputStreamReader isr = new InputStreamReader(is, "utf-8");

??????????????? BufferedReader br = new BufferedReader(isr);

??????????????? String str = null;

??????????????? while ((str = br.readLine()) != null) {

??????????????????? buffer.append(str);

??????????????? }

??????????????? br.close();

??????????????? isr.close();

??????????????? is.close();

??????????????? res = buffer.toString();

??????????????? parseJsonString(res, fields);

??????????? }

??????? } catch (Exception e) {

??????????? e.printStackTrace();

??????? }

??? }

??? //解析json字符串

??? public static void? parseJsonString(String json, String[] fields) {

??????? LinkedHashMap<String, Object> jsonMap= JSON.parseObject(json,

??????????????? new? TypeReference<LinkedHashMap<String, Object>>() {

??????????????? });

??????? for (Map.Entry<String,

? Object> entry : jsonMap.entrySet()) {

??????????? parseJsonMap(entry, fields);

??????? }

??? }


??? /*

??? ?* 1、循環(huán)解析json

??? ?* 2、判斷鍵名在json哪一層

??? ?* 3躺彬、根據(jù)鍵名獲取數(shù)據(jù)并存儲(chǔ)到數(shù)組中

??? ?* 4、將數(shù)組存儲(chǔ)到list中

??? ?*/

??? public static void? parseJsonMap(Map.Entry<String, Object> entry,String[] fields) {

??????? //

? 如果是單個(gè)map繼續(xù)遍歷

??????? if (entry.getValue() instanceof Map) {

??????????? LinkedHashMap<String, Object> jsonMap= JSON.parseObject(entry.getValue().toString(),

??????????????????? new? TypeReference<LinkedHashMap<String, Object>>() {

??????????????????? });

??????????? for (Map.Entry<String,

? Object> entry2 : jsonMap.entrySet()) {

??????????????? parseJsonMap(entry2,fields);

??????????? }

??????? }

??????? //

? 如果是list就提取出來

??????? if (entry.getValue() instanceof List) {

??????????? Listlist=? (List)entry.getValue();

??????????? for (int i = 0; i < list.size(); i++) {

??????????????? // 如何還有梅惯,循環(huán)提取

??????????????? if(list.get(i).toString().contains("[") || (list.get(i).toString().contains("{"))) {

??????????????????? LinkedHashMap<String, Object> jsonMap= JSON.parseObject(list.get(i).toString(),

??????????????????????????? new? TypeReference<LinkedHashMap<String, Object>>() {

??????????????????????????? });

??????????????????? Object[] str1=new Object[fields.length];

??????????????????? for (Map.Entry<String,

? Object> entry1 : jsonMap.entrySet()) {

??????????????????????? if(Arrays.asList(fields).contains(entry1.getKey())) {

??????????????????????????? JSONObject jObject=JSON.parseObject(list.get(i).toString());

??????????????????????????? String jString=JSONObject.toJSONString(jObject,SerializerFeature.WriteMapNullValue);

??????????????????????????? JSONObject jObject2=JSON.parseObject(jString);


??????????????????????????? for (int j = 0; j < fields.length; j++) {

??????????????????????????????? if(jObject2.getString(fields[j])==null) {

??????????????????????????????????? str1[j]="";

??????????????????????????????? }else {

??????????????????????????????????? str1[j]=jObject2.getString(fields[j]);

??????????????????????????????? }

??????????????????????????? }

??????????????????????? }else {

??????????????????????????? parseJsonString(list.get(i).toString(), fields);

??????????????????????? }

??????????????????? }

??????????????????? data.add(str1);

??????????????? }

??????????? }

??????? }

??? }

}



2.? ? ? ? 將自定義數(shù)據(jù)集類導(dǎo)出jar包

3.? ? ? 設(shè)計(jì)器中將自定義數(shù)據(jù)集jar包和fastjsonjar包導(dǎo)入進(jìn)來

4.? ? ? ? 新建報(bào)表-新建參數(shù)url和fields

參數(shù)url:字符串類型宪拥、jsonurl

參數(shù)fields:字符串類型、json鍵名

5.? ? ? ? 新建數(shù)據(jù)集铣减,數(shù)據(jù)源不選擇她君、類型為自定義類型

編輯查詢sql,寫這個(gè)自定義數(shù)據(jù)集類的package.class

選擇數(shù)據(jù)集參數(shù)葫哗,將需要傳參的參數(shù)設(shè)置上去(參數(shù)順序和自定義數(shù)據(jù)集類中的順序一致)

6.? ? ? ? 報(bào)表設(shè)計(jì)

A3表達(dá)式 =ds.select(#0) ,擴(kuò)展方向?yàn)榭v向擴(kuò)展

B2表達(dá)式 =parting(@fields,','),擴(kuò)展方向?yàn)闄M向擴(kuò)展

B3表達(dá)式=eval("ds.getone("+B2+",#0=A3)")

7.? ? ?Web預(yù)覽

8.? ? ? 讀取json數(shù)據(jù)成功缔刹。

9.? ? ?將brt文件、fastjson jar包和自定義數(shù)據(jù)集jar包復(fù)制到 web應(yīng)用中劣针。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末校镐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酿秸,更是在濱河造成了極大的恐慌灭翔,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辣苏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡哄褒,警方通過查閱死者的電腦和手機(jī)稀蟋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呐赡,“玉大人退客,你說我怎么就攤上這事×脆郑” “怎么了萌狂?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)怀泊。 經(jīng)常有香客問我茫藏,道長(zhǎng),這世上最難降的妖魔是什么霹琼? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任务傲,我火速辦了婚禮凉当,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘售葡。我一直安慰自己看杭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布挟伙。 她就那樣靜靜地躺著楼雹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尖阔。 梳的紋絲不亂的頭發(fā)上贮缅,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音诺祸,去河邊找鬼携悯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛筷笨,可吹牛的內(nèi)容都是我干的憔鬼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼胃夏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼轴或!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仰禀,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤照雁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后答恶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饺蚊,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年悬嗓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了污呼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡包竹,死狀恐怖燕酷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情周瞎,我是刑警寧澤苗缩,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站声诸,受9級(jí)特大地震影響酱讶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜双絮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一浴麻、第九天 我趴在偏房一處隱蔽的房頂上張望得问。 院中可真熱鬧,春花似錦软免、人聲如沸宫纬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)漓骚。三九已至,卻和暖如春榛泛,著一層夾襖步出監(jiān)牢的瞬間蝌蹂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工曹锨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孤个,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓沛简,卻偏偏與公主長(zhǎng)得像齐鲤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椒楣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349