blob与json互转,后台保存,前端显示
目录
1、前端显示(blob转json)
解释:从数据库-oracle取出该blob,进行blob转json;blob类型在数据库中以二进制字节流存储【BLOB(二进制大对象)是一个变长的二进制字符串,最长可达2,147,483,647个字符。与其他二进制类型一样,BLOB字符串与代码页无关。另外,BLOB字符串不包含字符数据。
BLOB以字节为单位给出长度,除非给出后缀K,M或G中的一个,分别与1024,1024 * 1024,1024 * 1024 * 1024的倍数相关。
注意:长度以字节为单位指定BLOB。】
(1)代码如下(借助BlobHelper工具类)
/**
fieldguid:主键id
col:列名
**/
public static Map<String,String> getFieldBlobToJson(String fieldguid,String col){
Map<String,String> json=new HashMap<String,String>();
try {
InputStream field=BlobHelper.query(dataModel, "M_FIELDDEF", col, fieldguid);
if(null==field) return json;
String xmlStr =BlobHelper.streamToString(field);
Document ret= DocumentHelper.parseText(xmlStr);//
Element rootElement= ret.getRootElement();
if("FAUTOFILLDEF".equals(col)) {
json=getAutoFillData(rootElement);
}
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return json;
}
private static Map<String,String> getAutoFillData(Element rootElement) {
// TODO 自动生成的方法存根
Map<String,String> map=new HashMap<String,String>();
String defaultValue=getCDataOfElement(rootElement,"defaultValue");
String createExpr=getCDataOfElement(rootElement,"createExpr");
String calcExpr=getCDataOfElement(rootElement,"calcExpr");
String calcExpr2=getCDataOfElement(rootElement,"calcExpr2");
map.put("defaultValue", defaultValue);
map.put("createExpr", createExpr);
map.put("calcExpr", calcExpr);
map.put("calcExpr2", calcExpr2);
return map;
}
private static String getCDataOfElement(Element parentEl,String elLabel) {
// TODO 自动生成的方法存根
String res="";
Element elLabelEl=parentEl.element(elLabel);
@SuppressWarnings("rawtypes")
List content=elLabelEl.content();
for(Object o:content){
if(o instanceof CDATA){
CDATA cdata=(CDATA) o;
res=cdata.getText();
}
}
return res;
}
调试结果:xmlStr值
<autoFillDef majorVer="1" minorVer="0"><defaultValue><![CDATA[主键]]></defaultValue><createExpr><![CDATA[geoToTable(null,null,null,null,null,null)]]></createExpr><calcExpr2><![CDATA[$model.B_SuperviseMsg.val("FGUID")]]></calcExpr2><calcExpr><![CDATA[string()now()]]></calcExpr></autoFillDef>
前端接收的值为json
{defaultValue:“主键”,createExpr:“geoToTable(null,null,null,null,null,null)”}
oracle中该blob字段存储内容为
<?xml version="1.0" encoding="gbk"?>
<autoFillDef majorVer="1" minorVer="0">
<defaultValue><![CDATA[主键]]></defaultValue>
<createExpr><![CDATA[invokeStaticMethod(null,null,null,null)]]></createExpr>
<calcExpr><![CDATA[substring-before()]]></calcExpr>
<calcExpr2><![CDATA[$model.B_SuperviseMsg.val("FGUID")]]></calcExpr2>
</autoFillDef>
2、后台保存(json转blob)
把前端的数据组装成json字符串,在后台存储到oracle,进行json转blob
(1)前端组装成json字符串
var jsonObj={};
jsonObj.majorVer="1";
jsonObj.minorVer="0";
var domList=[];
var xmlData=this.comp("xmlData");
var cRow = xmlData.getCurrentRow();
var cols=xmlData.getColumnIDs().split(",");
for(var i=cols.length-1;i>-1;i--) {
if(cols[i]&&cols[i]!="fieldguid") {//非主键
var tempObj={};
tempObj[cols[i]]=cRow.val(cols[i]);
domList.push(tempObj);
}
}
jsonObj.domList=domList;
params.setString("fieldguid",self._params.fguid);
params.setString("col",self._params.col);
params.setString("lableName","autoFillDef");
params.setString("jsonObj",JSON.stringify(jsonObj));
(2)调用后台方法
代码如下(借助BlobHelper工具类),获取k-v键名键值(用entrySet()转换)
public static void saveJsonToBlob(String fieldguid,String col,String lableName,String jsonObj){
String domStr =null;
if(null!=jsonObj){
JSONObject obj = JSONObject.parseObject(jsonObj);
Document document = DocumentHelper.createDocument();
Element rootEl= document.addElement(lableName);
//fastjson解析方法
for (Map.Entry<String, Object> entry : obj.entrySet()) {
if(entry.getValue().toString().startsWith("[{")) {//key为json数组
if("FAUTOFILLDEF".equals(col)) {
addAutoFillDoms(rootEl, (JSONArray) entry.getValue());
}
} else {
rootEl.addAttribute(entry.getKey(), (String) entry.getValue());
}
}
domStr =rootEl.asXML();
}
System.out.println("domStr==="+domStr);
InputStream stream = BlobHelper.strToStream(domStr);
try {
BlobHelper.update(dataModel, "M_FIELDDEF", col, null, fieldguid, null, stream);
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
private static void addAutoFillDoms(Element rootEl, JSONArray domList) {
// TODO 自动生成的方法存根
if(domList.size()>0) {
for(Iterator<Object> iterator=domList.iterator();iterator.hasNext();) {
JSONObject json=(JSONObject) iterator.next();
for(Map.Entry<String,Object> entry:json.entrySet()) {
org.dom4j.Element el=rootEl.addElement(entry.getKey());
el.addCDATA((String) entry.getValue());
}
}
}
}
存储后结果为,与真实正确结果稍有差距,后续需修改,(格式不当与xml头缺失)
<autoFillDef majorVer="1" minorVer="0"><defaultValue><![CDATA[字段86]]></defaultValue><createExpr><![CDATA[updateBizData( null , null )jsonPut( null , null )getRandomDate( null , null )]]></createExpr><calcExpr2><![CDATA[val("fRuleContent")]]></calcExpr2><calcExpr><![CDATA[now()]]></calcExpr></autoFillDef>
总结:处理后台字段类型与前端显示转换时应查找api文档,有支持类型转换的api工具或辅助类可直接使用,总体来说后续还是要多实操,动手掌握
util附件:BlobHelper.java
具体哪个包不清楚了,或者根据自己项目改下导入,我一直以为时java自带的api,需要导包吧
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.sql.Timestamp;
import com.justep.system.data.BlobUtils;
public class BlobHelper {
public static Timestamp delete(String blobDataModel, String blobConcept, String blobRelation, String blobLastModifiedRelation, String blobConceptValue) throws Exception {
return BlobUtils.delete(blobDataModel, blobConcept, blobRelation, blobLastModifiedRelation, blobConceptValue);
}
public static InputStream query(String blobDataModel, String blobConcept, String blobRelation, String blobConceptValue) throws Exception {
return BlobUtils.query(blobDataModel, blobConcept, blobRelation, blobConceptValue);
}
public static Timestamp update(String blobDataModel, String blobConcept, String blobRelation, String blobLastModifiedRelation, String blobConceptValue, String limitSize, InputStream blobData) throws Exception {
return BlobUtils.update(blobDataModel, blobConcept, blobRelation, blobLastModifiedRelation, blobConceptValue, limitSize, blobData);
}
public static String streamToString (InputStream inputStream){
if(null==inputStream) return null;
try {
ByteArrayOutputStream boa=new ByteArrayOutputStream();
int len=0;
byte[] buffer=new byte[1024];
while((len=inputStream.read(buffer))!=-1){
boa.write(buffer,0,len);
}
inputStream.close();
boa.close();
byte[] result=boa.toByteArray();
String temp=new String(result);
//识别编码
if(temp.contains("utf-8")){
return new String(result,"utf-8");
}else if(temp.contains("gb2312")){
return new String(result,"gb2312");
}else if(temp.contains("gbk")){
return new String(result,"gbk");
}else{
return temp;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
public static InputStream strToStream(String str){
InputStream is=null;
if(null==str)return is;
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(str.getBytes());
is=(InputStream)byteArrayInputStream;
return is;
}
}