java 解析php序列化資料問題

TOP__ONE發表於2017-03-21

有很多情況會涉及到php和java進行資料交換。一般情況是通過json資料格式去交換。但是對於那種比如:商城採用php進行開發,管理系統使用java語言開發,這其中就會涉及到資料互動,而正好php進行過資料序列化儲存到資料庫,而java還必須去解析,所以就會有這篇文章。開始我也上網查詢過相關的工具類去進行解析,比如說我看到的一篇相關文章解決辦法(在最後附錄上)。下面介紹我我的方法如下:

1.這是我根據分析php序列化後的字串進行的對序列化字串的解析:

 public static Map<Object,Object> phpToJava(String str){
    	str = "a:8:{s:5:\"phone\";s:6:\"111111\";s:9:\"mob_phone\";s:6:\"111111\";s:9:\"tel_phone\";N;s:7:\"address\";s:90:\"北京市東城區天天大廈B座-Барнаул-Алтайский край-Россия\";s:4:\"area\";s:55:\"Барнаул-Алтайский край-Россия\";s:6:\"street\";s:34:\"北京市東城區天天大廈B座\";s:7:\"zipcode\";s:9:\"王某某\";s:8:\"passport\";s:0:\"\";}";
		str=str.substring(5,str.length()-1);
    	str = str.replaceAll("[s|i]:\\d+:", "").replaceAll("N", "\"\"");

		String[] split = str.split(";");
		HashMap<Object,Object> list =new HashMap<Object, Object>();
		for (int i = 0; i < split.length; i=i+2) {
			if(i%2==0){
				list.put(split[i].replaceAll("\"", ""), split[i+1].replaceAll("\"", ""));
			}
		}
		for(Map.Entry<Object, Object> map : list.entrySet()){
			System.out.print(map.getKey()+"=");
			System.out.println(map.getValue());
		}
    	return list;
    }

2.通過main方法進行測試輸出即可得到結果,返回值是一個map~

  public static void main(String[] args) {
    	phpToJava2(null);
  }




****************************************************************************************************************************************************************************************

<<以下是從網站上搜到的工具類,可以嘗試下>>

1、引入maven依賴

<!--反序列化 php-->
<dependency>
<groupId>org.sction</groupId>
<artifactId>phprpc</artifactId>
<version>3.0.2</version>
</dependency>

2、反序列化物件方法

 

public static Test getUnserialize(String content) throws Exception {
    PHPSerializer p = new PHPSerializer();
    if (StringUtils.isEmpty(content))
        return null;
    Test t =  (Test) p.unserialize(content.getBytes(),Test.class);
    return t;
}

 

3、測試結果

4、反序列化物件陣列 這裡的物件是字串物件

 

/**
* 對php序列化的字串,進行反序列化
*/
public List<String> unserializePHParray(String content){
List<String> list = new ArrayList<String>();
PHPSerializer p = new PHPSerializer();
if (StringUtils.isEmpty(content))
return list;
try {
AssocArray array = (AssocArray) p.unserialize(content.getBytes());
for (int i = 0; i < array.size(); i++) {
String t = (String) Cast.cast(array.get(i), String.class);
list.add(t);
}
}catch (Exception e){
System.out.println("反序列化PHParray: " + content + " 失敗!!!" );
}
return list;
}

 

5、測試結果

public static void main(String args[]) {
String content ="a:10:{i:0;s:18:\"舞蹈(私教)\";i:1;s:5:\"Zumba\";i:2;s:12:\"完美塑造\";i:3;s:12:\"戰鬥有氧\";i:4;s:12:\"槓鈴雕塑\";i:5;s:12:\"核心特訓\";i:6;s:12:\"漫步舞林\";i:7;s:12:\"身體平衡\";i:8;s:12:\"高效衝擊\";i:9;s:12:\"魅力熱舞\";}";
CoachTool tool = new CoachTool();
List<String> reusltList = tool.unserializePHParray(content);
System.out.println(reusltList);

}

輸出:[舞蹈(私教), Zumba, 完美塑造, 戰鬥有氧, 槓鈴雕塑, 核心特訓, 漫步舞林, 身體平衡, 高效衝擊, 魅力熱舞]


相關文章