Java将xml转化成json案例

xml格式如下:

<plist version="1.0">
<array>
<dict>
<key>cities</key>
<array>
<dict>
<key>areas</key>
<array>
<dict>
<key>streets</key>
<array>
<string>东华门街道</string>
<string>景山街道</string>
<string>交道口街道</string>
<string>安定门街道</string>
<string>北新桥街道</string>
<string>东四街道</string>
<string>朝阳门街道</string>
<string>建国门街道</string>
<string>东直门街道</string>
<string>和平里街道</string>
<string>前门街道</string>
<string>崇文门外街道</string>
<string>东花市街道</string>
<string>龙潭街道</string>
<string>体育馆路街道</string>
<string>天坛街道</string>
<string>永定门外街道</string>
</array>
<key>county</key>
<string>东城区</string>
</dict>
<dict>
                      ......

通过dom4j解析xml,代码如下:

import java.io.InputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class XmlParser {
		
	public static void main(String[] args) throws Exception{
	JSONArray array = new JSONArray();	
	InputStream inputStream = XmlParser.class.getResourceAsStream("/area.xml");
	SAXReader reader = new SAXReader();   
	Document document = reader.read(inputStream);
	Element rootElement = document.getRootElement();
	parseXML(rootElement,array);
	System.out.println(array.toString());	
	inputStream.close();
	}	
	
	/**
	 * pengweikang 20180509 xml转化json
	 * @param element 根结点对象
	 * @param array json数组
	 */
	public static void parseXML(Element element,JSONArray array) {
		
		Element arrayElement = element.element("array");
		
		List<Element> listElmenet = arrayElement.elements();
		for(Element distElement :listElmenet) {
			JSONObject jsonObject = new JSONObject();
			List<Element> keysElements = null;	
			try {Element keyElement = distElement.element("string");jsonObject.put("name", keyElement.getText());} catch (Exception e1) {
				jsonObject.put("name", distElement.getText());
			}
			try {keysElements = distElement.elements("key");jsonObject.put("type", keysElements.get(0).getText());} catch (Exception e1) {}
			try {jsonObject.put("key", keysElements.get(1).getText());} catch (Exception e1) {}
			try {	
			List<Element> temparrayElements = distElement.element("array").elements();
			if(temparrayElements!= null && temparrayElements.size() > 0) {
				JSONArray temparray = new JSONArray();
				parseXML(distElement,temparray);//递归查找添加到JSON中
				jsonObject.put("array", temparray);
			}
			}catch(Exception e) {
				e.printStackTrace();
			}
			array.add(jsonObject);
		}
	}
}

生成的json如下:

[
  {
    "name": "北京市",
    "type": "cities",
    "key": "state",
    "array": [
      {
        "name": "北京市",
        "type": "areas",
        "key": "city",
        "array": [
          {
            "name": "东城区",
            "type": "streets",
            "key": "county",
            "array": [
              {
                "name": "东华门街道"
              ......


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是微信小程序支付ApiV3版本java开发的完整案例: 1. 首先,你需要在微信商户平台上创建一个应用并获取到以下信息: - 商户号(mch_id) - 商户APIv3密钥(api_key) - 应用ID(appid) - 商户证书私钥文件(apiclient_key.pem) - 商户证书文件(apiclient_cert.pem) - 微信支付平台证书文件(weixinpay_cert.pem) 2. 接下来,你需要使用Java SDK进行开发,包括以下步骤: - 导入相关的Java SDK依赖包。 - 构建请求参数,包括HTTP请求头和请求体,其中请求体需要使用商户证书进行签名。 - 发送HTTP请求,并处理响应数据。 以下是一个简单的Java代码片段,演示如何使用Java SDK实现微信小程序支付ApiV3版本: ``` import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayConstants; import com.github.wxpay.sdk.WXPayUtil; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.security.*; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.HashMap; import java.util.Map; public class WxPayApiV3Demo { private static final String API_KEY = "商户APIv3密钥"; private static final String MCH_ID = "商户号"; private static final String APP_ID = "应用ID"; private static final String API_BASE_URL = "https://api.mch.weixin.qq.com/"; private static final String PRIVATE_KEY_FILE = "apiclient_key.pem"; private static final String CERT_FILE = "apiclient_cert.pem"; private static final String WEIXINPAY_CERT_FILE = "weixinpay_cert.pem"; private static final String CHARSET = StandardCharsets.UTF_8.name(); private static final String API_PAY = "v3/pay/transactions/jsapi"; private static final String API_CERTIFICATE = "v3/certificates"; private static PrivateKey privateKey; private static X509Certificate certificate; private static X509Certificate weixinpayCertificate; static { try { privateKey = loadPrivateKey(new File(PRIVATE_KEY_FILE)); certificate = loadCertificate(new File(CERT_FILE)); weixinpayCertificate = loadCertificate(new File(WEIXINPAY_CERT_FILE)); } catch (Exception e) { throw new RuntimeException("Failed to load certificate.", e); } } public static void main(String[] args) throws Exception { // 构建请求参数 Map<String, String> params = new HashMap<>(); params.put("appid", APP_ID); params.put("mchid", MCH_ID); params.put("description", "测试商品"); params.put("out_trade_no", "1234567890"); params.put("amount", "{\"total\":100,\"currency\":\"CNY\"}"); params.put("payer", "{\"openid\":\"用户openid\"}"); params.put("notify_url", "https://example.com/notify"); // 发送HTTP请求 String response = doPost(API_PAY, params); System.out.println(response); } private static String doPost(String api, Map<String, String> params) throws Exception { String url = API_BASE_URL + api; String timestamp = String.valueOf(System.currentTimeMillis() / 1000); // 构建请求头 Map<String, String> headers = new HashMap<>(); headers.put(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType()); headers.put(HttpHeaders.AUTHORIZATION, buildAuthorizationHeader(api, timestamp, params)); // 构建请求体 String requestBody = WXPayUtil.mapToXml(params); String signature = sign(requestBody, timestamp); String signedRequestBody = buildSignedRequestBody(requestBody, signature); // 发送HTTP请求 HttpPost httpPost = new HttpPost(url); headers.forEach(httpPost::addHeader); httpPost.setEntity(new StringEntity(signedRequestBody, CHARSET)); try (CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse httpResponse = httpClient.execute(httpPost)) { HttpEntity entity = httpResponse.getEntity(); return IOUtils.toString(entity.getContent(), CHARSET); } } private static String buildAuthorizationHeader(String api, String timestamp, Map<String, String> params) throws Exception { String nonceStr = WXPayUtil.generateUUID(); String message = buildMessage(api, timestamp, nonceStr, params); String signature = sign(message); return String.format("WECHATPAY2-SHA256-RSA2048 mchid=\"%s\",nonce_str=\"%s\",timestamp=\"%s\",serial_no=\"%s\",signature=\"%s\"", MCH_ID, nonceStr, timestamp, weixinpayCertificate.getSerialNumber().toString(16), signature); } private static String buildMessage(String api, String timestamp, String nonceStr, Map<String, String> params) { StringBuilder sb = new StringBuilder(); sb.append("POST\n") .append(API_BASE_URL).append(api).append("\n") .append(buildQueryString(params)).append("\n") .append(HttpHeaders.CONTENT_TYPE).append(":").append(ContentType.APPLICATION_JSON.getMimeType()).append("\n") .append(HttpHeaders.ACCEPT).append(":").append(ContentType.APPLICATION_JSON.getMimeType()).append("\n") .append(HttpHeaders.AUTHORIZATION).append(":").append(buildAuthorizationHeader(api, timestamp, params)).append("\n") .append("Wechatpay-Timestamp:").append(timestamp).append("\n") .append("Wechatpay-Nonce:").append(nonceStr).append("\n") .append("Wechatpay-Serial:").append(weixinpayCertificate.getSerialNumber().toString(16)).append("\n"); return sb.toString(); } private static String buildQueryString(Map<String, String> params) { StringBuilder sb = new StringBuilder(); params.entrySet().stream() .sorted(Map.Entry.comparingByKey()) .forEach(entry -> { if (sb.length() > 0) { sb.append("&"); } sb.append(entry.getKey()).append("=").append(entry.getValue()); }); return sb.toString(); } private static String sign(String message) throws Exception { Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(message.getBytes(StandardCharsets.UTF_8)); return Base64.encodeBase64String(signature.sign()); } private static String sign(String requestBody, String timestamp) throws Exception { StringBuilder sb = new StringBuilder(); sb.append(timestamp).append("\n") .append(nonceStr()).append("\n") .append(requestBody).append("\n"); return sign(sb.toString()); } private static String buildSignedRequestBody(String requestBody, String signature) { return requestBody.replace("</xml>", String.format("<sign_type><![CDATA[SHA256]]></sign_type><sign><![CDATA[%s]]></sign></xml>", signature)); } private static String nonceStr() { return WXPayUtil.generateUUID(); } private static PrivateKey loadPrivateKey(File file) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { byte[] bytes = FileUtils.readFileToByteArray(file); PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(bytes); KeyFactory factory = KeyFactory.getInstance("RSA"); return factory.generatePrivate(spec); } private static X509Certificate loadCertificate(File file) throws IOException, CertificateException { byte[] bytes = FileUtils.readFileToByteArray(file); return WXPayUtil.loadCertificate(bytes); } } ``` 上述代码中,我们使用了微信提供的Java SDK(https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient),它封装了HTTP请求和签名验证的相关逻辑,并提供了一些实用的工具类。在这个示例中,我们使用了WXPayUtil工具类来进行签名、验签和XML格式的转换。我们还使用了Apache HttpClient来发送HTTP请求。 需要注意的是,该示例中使用的是微信提供的Java SDK中的最新版本,如果你使用的是旧版本,可能会存在一些差异。 此外,该示例中只演示了如何实现支付接口,如果你需要实现其他接口,可以参考微信官方文档(https://wechatpay-api.gitbook.io/wechatpay-api-v3/)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值