總結(jié)-數(shù)據(jù)交換格式

客戶端與服務(wù)端常見(jiàn)的數(shù)據(jù)交換格式有xml ,json,html
移動(dòng)端常用http+json
webservice采用html+xml

json

使用fastjson解析json

public static final Object parse(String text); // 把JSON文本parse為JSONObject或者JSONArray 
public static final JSONObject parseObject(String text)豆同; // 把JSON文本parse成JSONObject    
public static final  T parseObject(String text, Class clazz); // 把JSON文本parse為JavaBean 
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray 
public static final  List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合 
public static final String toJSONString(Object object); // 將JavaBean序列化為JSON文本 
public static final String toJSONString(Object object, boolean prettyFormat); // 將JavaBean序列化為帶格式的JSON文本 
public static final Object toJSON(Object javaObject); 將JavaBean轉(zhuǎn)換為JSONObject或者JSONArray跛溉。

xml格式

解析xml一般三種:dom4j sax

dom4j解析xml

package com.xml;

import com.sun.xml.internal.ws.util.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.OutputStreamWriter;
import java.util.List;

/**
 * xml解析方式, Dom4j邻吞、Sax、Pull
 * dom4j不適合大文件的解析锁施,因?yàn)樗且幌伦訉⑽募虞d到內(nèi)存中,所以有可能出現(xiàn)內(nèi)存溢出,
 * sax是基于事件來(lái)對(duì)xml進(jìn)行解析的号醉,所以他可以解析大文件的xml,
 */
public class App {

    /**
     * 創(chuàng)建節(jié)點(diǎn)
     */
    public static void add(String fileName) {
        Document document = DocumentHelper.createDocument();
        //根節(jié)點(diǎn)
        Element beans = document.addElement("beans");
        beans.addComment("zhu shi");
        //命名空間
        beans.addNamespace("context", "http://www.springframework.org/schema/context");
        beans.addNamespace("bean", "http://www.springframework.org/schema/bean");
        beans.addNamespace("jdbc", "http://www.springframework.org/schema/jsbc");
        beans.addNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
        beans.addAttribute("xsi:schemaLocation", "http://www.springframework.org/schema/beans \n " +
                "   http://www.springframework.org/schema/beans/spring-beans.xsd \n " +
                "   http://www.springframework.org/schema/context \n " +
                "   http://www.springframework.org/schema/context/spring-context.xsd\n " +
                "   http://www.springframework.org/schema/aop \n " +
                "   http://www.springframework.org/schema/aop/spring-aop.xsd");
        //節(jié)點(diǎn) <context:component-scan base-package="com.paopao"/>
        beans.addElement("context:component")
                .addAttribute("basepackage", "com.paopao");
        //bean節(jié)點(diǎn)
        beans.addElement("bean")
                .addAttribute("id", "UserService")
                .addAttribute("class", "com.demo.service");
        //property
        beans.addElement("bean")
                .addAttribute("id", "userController")
                .addAttribute("class", "com.demo.controller")
                .addElement("property")
                .addAttribute("name", "destroy")
                .addAttribute("name", "init").setText("init");
        //子節(jié)點(diǎn)
        Element bean = beans.addElement("bean")
                .addAttribute("id", "user")
                .addAttribute("class", "com.demo.pojo");
        bean.addElement("property")
                .addAttribute("name", "username")
                .addAttribute("value", "xiaoming");
        bean.addElement("property")
                .addAttribute("name", "password")
                .addAttribute("value", "123456");
        try {
            OutputFormat outputFormat = OutputFormat.createPrettyPrint();
            outputFormat.setEncoding("UTF-8");
            XMLWriter xmlWriter = new XMLWriter(new FileWriter(new File(fileName)), outputFormat);
            xmlWriter.write(document);
            xmlWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return;
    }

    /**
     * 解析xml文件
     */
    public static void xml(String fileName) {
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(new File(fileName));
            Element beans = document.getRootElement();
            //獲取根目錄下的子元素
            List<Element> list = beans.elements();
            for (Element e : list) {
                if ("bean".equals(e.getName())) {
                    String beanName = e.attributeValue("id");
                    String beanPackage = e.attributeValue("class");
                    List<Element> element = e.elements();
                    if (!element.equals(null)) {
                        for (Element ele : element) {
                            String name = ele.attributeValue("name");
                            String value = ele.attributeValue("value");
                            String text = ele.getText();
                            System.out.println(name+value+text);
                        }
                    }
                    System.out.println(beanPackage + "." + beanName);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        App.add("d:/file-mianshi/b.xml");
        App.xml("d:/file-mianshi/b.xml");
    }
}
xml1.png

xml2.png

Java反射

動(dòng)態(tài)獲取這個(gè)類的所有信息辛块。包括java對(duì)象的屬性,方法,構(gòu)造函數(shù)等
反射獲取類
Class.forName("com.demo.pojo.User");
User.class;
(new User()).getClass();
實(shí)例化類(構(gòu)造對(duì)象)
無(wú)參構(gòu)造
Class<?> clazz = Class.forName("...")
Object user = clazz.newInstance();
有參構(gòu)造
Class<?> clazz = Class.forName("...")
Constructor<?>constructor = forName.getConstructor(String.class, String.class);
User user = (User) constructor.newInstance("name", "xiaoming");

反射創(chuàng)建api

getDeclaredMethods []
getReturnType()
getParameterTypes()
getDeclaredFields()
setAccessible //允許訪問(wèn)私有成員

springioc的簡(jiǎn)單實(shí)現(xiàn)

  讀取xml文件
  裝配bean
  反射賦值
新建xml文檔
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="student" class="com.xml.pojo.Student">
        <property name = "name" value="網(wǎng)癮少年"></property>
    </bean>
    
    <bean id="teacher" class="com.xml.pojo.Teacher">
        <constructor-arg name="name" value="雷電法王"></constructor-arg>
        <constructor-arg name="student" ref="student"></constructor-arg>
    </bean>
    
    <bean id="play" class="com.xml.service.Play">
        <property name="teacher" ref="teacher"></property>
        <property name="student" ref="student"></property>
    </bean>
</beans>

解析xml

package com.xml;

import com.xml.service.Play;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.beans.ConstructorProperties;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author cailonghao
 */
public class Cxml {

    /**
     * 拿到裝載bean的實(shí)例
     */
    public static Map xml(String file) {
        //存放bean
        Map<String, Class<?>> map1 = new HashMap<>();
        //存放節(jié)點(diǎn)
        Map<String, Object> map2 = new HashMap<>();
        //存放對(duì)象
        Map<String, Object> map3 = new HashMap<>();

        SAXReader reader = new SAXReader();
        try {
            //獲取根節(jié)點(diǎn)并遍歷子節(jié)點(diǎn)
            Document document = reader.read(new File(file));
            Element beans = document.getRootElement();
            List<Element> list = beans.elements();
            for (Element element : list) {
                String beanName = element.attributeValue("id");
                String beanPackage = element.attributeValue("class");
                Class<?> clazz = Class.forName(beanPackage);
                map1.put(beanName, clazz);
                map2.put(beanName, element.elements());
            }
            //拿到?jīng)]引用的bean
            for (Map.Entry<String, Object> entry : map2.entrySet()) {
                String beanName = entry.getKey();
                List<Element> elements = (List<Element>) entry.getValue();
                for (Element element : elements) {
                    if ("property".equals(element.getName())) {
                        String name = element.attributeValue("name");
                        Object value = element.attributeValue("ref");
                        if (value == null) {
                            value = element.attributeValue("value");
                            Object object = map1.get(beanName).newInstance();
                            Field field = object.getClass().getDeclaredField(name);
                            field.setAccessible(true);
                            field.set(object, value);
                            map3.put(beanName, object);
                        }
                    }
                }
            }
            ;
            //拿有構(gòu)造的
            for (Map.Entry<String, Object> entry : map2.entrySet()) {
                String beanName = entry.getKey();
                List<Element> elements = (List<Element>) entry.getValue();
                List<Object> ls = new ArrayList<>();
                int i = 1;
                for (Element element : elements) {
                    if ("constructor-arg".equals(element.getName())) {
                        String name = element.attributeValue("name");
                        Object value = element.attributeValue("value");
                        if (value == null) {
                            value = map3.get(element.attributeValue("ref"));
                        }
                        ls.add(0, beanName);
                        ls.add(i, value);
                        i++;
                    }
                }
                if (!(ls.isEmpty())) {
                    Class<?> clazz = map1.get(ls.get(0));
                    Constructor constructor = clazz.getConstructor(ls.get(1).getClass(), ls.get(2).getClass());
                    Object object = constructor.newInstance(ls.get(1), ls.get(2));
                    map3.put((String) ls.get(0), object);
                }
            }
            ;
            //拿有引用bean的
            for (Map.Entry<String, Object> entry : map2.entrySet()) {
                String beanName = entry.getKey();
                List<Element> elements = (List<Element>) entry.getValue();
                for (Element element : elements) {
                    if ("property".equals(element.getName())) {
                        if (!(map3.containsKey(beanName))) {
                            String name = element.attributeValue("name");
                            Object value = element.attributeValue("value");
                            if (value == null) {
                                value = map3.get(element.attributeValue("ref"));
                            }
                            Object object = map1.get(beanName).newInstance();
                            Field field = object.getClass().getDeclaredField(name);
                            field.setAccessible(true);
                            field.set(object, value);
                            map3.put(beanName, object);
                        }
                    }
                }
            }
        } catch (Exception e) {
            //todo
            e.printStackTrace();
        } finally {
            return map3;
        }
    }

    public static void main(String[] args) {
        Map map = Cxml.xml("d:/file-mianshi/c.xml");
        System.out.println(map)   
    }
}
xml3.png

遺憾:上面的代碼太爛了,而且student為Null了,有時(shí)間在重構(gòu)一遍

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末畔派,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子润绵,更是在濱河造成了極大的恐慌线椰,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件授药,死亡現(xiàn)場(chǎng)離奇詭異士嚎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)悔叽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門莱衩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人娇澎,你說(shuō)我怎么就攤上這事笨蚁。” “怎么了趟庄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵括细,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我戚啥,道長(zhǎng)奋单,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任猫十,我火速辦了婚禮览濒,結(jié)果婚禮上呆盖,老公的妹妹穿的比我還像新娘。我一直安慰自己贷笛,他們只是感情好应又,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著乏苦,像睡著了一般株扛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汇荐,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天洞就,我揣著相機(jī)與錄音,去河邊找鬼拢驾。 笑死奖磁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的繁疤。 我是一名探鬼主播咖为,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼稠腊!你這毒婦竟也來(lái)了躁染?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤架忌,失蹤者是張志新(化名)和其女友劉穎吞彤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體叹放,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饰恕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了井仰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埋嵌。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖俱恶,靈堂內(nèi)的尸體忽然破棺而出雹嗦,到底是詐尸還是另有隱情,我是刑警寧澤合是,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布了罪,位于F島的核電站,受9級(jí)特大地震影響聪全,放射性物質(zhì)發(fā)生泄漏泊藕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一难礼、第九天 我趴在偏房一處隱蔽的房頂上張望娃圆。 院中可真熱鬧汽久,春花似錦、人聲如沸踊餐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吝岭。三九已至,卻和暖如春吧寺,著一層夾襖步出監(jiān)牢的瞬間窜管,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工稚机, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幕帆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓赖条,卻偏偏與公主長(zhǎng)得像失乾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纬乍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容