java 解析php序列化数据问题

有很多情况会涉及到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, 完美塑造, 战斗有氧, 杠铃雕塑, 核心特训, 漫步舞林, 身体平衡, 高效冲击, 魅力热舞]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值