注:我是EclipseLink JAXB (MOXy)鉛和JAXB (JSR-222)專家小組的成員。
以下是您如何使用MOXy作爲JSON綁定提供程序來支持此用例。
Java模型
默認情況下,一個JAXB實現將一個byte[]
轉換爲base64Binary的。您可以使用HexBinaryAdapter
將其表示爲hexBinary。
package forum15643723;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
private byte[] foo;
@XmlJavaTypeAdapter(HexBinaryAdapter.class)
private byte[] bar;
}
演示
在演示代碼下面我們將讀取到的JSON對象,然後寫回JSON。
package forum15643723;
import java.util.*;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.jaxb.JAXBContextProperties;
public class Demo {
public static void main(String[] args) throws Exception {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBContextProperties.MEDIA_TYPE, "application/json");
properties.put(JAXBContextProperties.JSON_INCLUDE_ROOT, false);
JAXBContext jc = JAXBContext.newInstance(new Class[] {Root.class}, properties);
Unmarshaller unmarshaller = jc.createUnmarshaller();
StreamSource json = new StreamSource("src/forum15643723/input.json");
Root root = (Root) unmarshaller.unmarshal(json, Root.class).getValue();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
jaxb.properties
要指定莫西爲您的JAXB提供你需要包括一個名爲在同一個包jaxb.properties
爲您的域模型文件(見:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
input.json /輸出
foo
的和bar
屬性表示相同的數據。 foo
表示爲base64Binary,bar
表示爲hexBinary。
{
"foo" : "3q2+78r+",
"bar" : "DEADBEEFCAFE"
}
更多信息
爲什麼JSON如何傳播二進制數據很重要?這聽起來像可能是Base64 - 因此解碼base64以獲取原始二進制數據,然後您可以根據需要顯示它。 – 2013-03-26 17:37:06
會給這個想法一個鏡頭,謝謝喬恩! – Robb 2013-03-26 17:38:46
請告訴我們一些代碼 – Jason 2013-03-27 05:35:50