晚上好!
我正在尝试将整个json对象插入到mysql表中。我正在使用json对象转换器将json转换为HashMap。杰森是这样的:
{
"content": {
"fill": "none",
"stroke": "#fff",
"path": [
["M", 422, 115],
["L", 472, 167.5]
],
"stroke-width": 4,
"stroke-linecap": "round",
"stroke-linejoin": "round",
"transform": [],
"type": "path",
"note": {
"id": 47,
"page":0,
"ref": 3,
"txt": "teste do serviço",
"addedAt": 1418133743604,
"addedBy": "valter.gomes"
}
}
}
我需要插入"内容"对象,但当我尝试通过#[payload.content]
访问它时,抛出异常:
Root Exception stack trace:
java.sql.SQLException: Incorrect string value: '\xAC\xED\x00\x05sr...' for column 'content' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
我们发现了我认为的解决方法。在转换为HashMap之前,我得到了内容"将对象转换为变量#[json:content]
并将其记录在DB #[flowVars.rawContent]
中。当我从DB中检索它时,我使用Object to String转换器将ResultSet转换为String。
但是,我对此解决方案并不满意。这是正确的方法吗?还是存在其他的?也许是正确的。
非常感谢你的帮助。
答案 0 :(得分:1)
当你收到json时,你可以转换为Map类(默认情况下json:json-to-object-transformer返回JsonData)。出于这个原因,我已经指定了Map类。因此,之后您可以使用#[payload.content]
我附上了我的流程:
<flow name="demoFlow1" doc:name="demoFlow1">
<http:inbound-endpoint exchange-pattern="request-response"
host="localhost" port="8081" path="demo" doc:name="HTTP" />
<scripting:component doc:name="Groovy">
<scripting:script engine="Groovy"><![CDATA[
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("fill","none");
map1.put("stroke","#fff");
Map<String, Object> map = new HashMap<String, Object>();
map.put("content", map1);
return map;]]></scripting:script>
</scripting:component>
<json:object-to-json-transformer doc:name="Object to JSON"/>
<logger level="INFO" message=">>1 #[payload]" doc:name="Logger" />
<json:json-to-object-transformer returnClass="java.util.Map" doc:name="JSON to Object"/>
<set-payload value="#[payload.content]" doc:name="Set Payload"/>
<json:object-to-json-transformer doc:name="Object to JSON"/>
<logger level="INFO" message=">>3 #[payload]" doc:name="Logger" />
</flow>
答案 1 :(得分:1)
Eddú是对的,但他给出的例子实在太复杂了。
正如他所说,你所需要的只是:
<json:json-to-object-transformer returnClass="java.util.Map" />
在该变换器之后,您可以检索Map中的任何字段/子字段。我建议顺便使用message.payload
代替payload
,后者在过去表现出一些奇怪的行为。
所以请使用:#[message.payload.content]
此外,这将为您提供类型为java.util.Map
的对象。不确定你将如何在数据库中插入对象,但由于你没有在你的问题中显示这一部分,我想你会想出来......