2010-10-15 51 views
4


我试图强制只包含一个元素的列表中的括号。JAXB JSON强制括号在阵列上

我想要这样的:
{“id”:“0”,“industries”:[{“id”:“0”,“name”:“Technologies”}],“name”:“ Google Inc.“}

但我得到:
{”id“:”0“,”industries“:{”id“:”0“,”name“:”Technologies“},”name“: “谷歌公司”}

这里是我的实体:

@Entity 
@XmlRootElement 
public class Company { 
private int id; 

private String name; 
private String description; 

@XMLElement(name="industries") 
private List<Industry> industryList; 

    [...] 

最后,我JAXB上下文解析器:

public JAXBContextResolver() throws Exception { 

MappedBuilder builder = JSONConfiguration.mapped(); builder.arrays(“industries”); builder.rootUnwrapping(true);

this.context = new JSONJAXBContext(builder.build(),Company.class); }

回答

0

我不太清楚这一点,但尝试去除@XMLElement注释industryList

我做的东西周围的其他方法:使用JAXB生成的XSD模式文件的Java类。我已经看过收集字段生成的类,他们没有任何具体的注释。

而且你可能想尝试JSON库:http://json-lib.sourceforge.net/

,你可以做这样的事情:

jsonString = JSONObject.fromObject(pojoObject) 

这将产生JSON字符串,将例如合并复杂类型的集合。

然后,您可以使用例如发送jsonString。 HttpServletResponse的。

我会推荐序列化DTO对象而不是序列化你的实体对象。

1

感谢您的帮助,但我找到了答案。实际上,您需要指定一个指定自然JSON配置的JAXBContextResolver。您需要提供需要转换为JSON的每个容器的类型列表。在本例中,您可以看到我指定了公司的容器GetCompanyResponse。

@Provider 
public class JAXBContextResolver implements ContextResolver<JAXBContext> { 
    private JAXBContext context; 
    private Class[] types = { GetCompanyResponse.class }; 

    public JAXBContextResolver() throws Exception { 
     this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), types); 
    } 

    public JAXBContext getContext(Class<?> objectType) { 
     for (Class clazz : types) { 
      if (clazz.equals(objectType)) { 
       return context; 
      } 
     } 

     return null; 
    } 
} 
0

注:我是EclipseLink JAXB (MOXy)铅和JAXB 2 (JSR-222)专家小组的成员。

EclipseLink JAXB(MOXy)提供本机JSON绑定支持。它将正确编组包含为JSON数组的大小为1的集合。下面是一个完整的例子。

公司

package forum3946102; 

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Company { 
    private int id; 

    private String name; 

    private String description; 

    @XmlElement(name = "industries") 
    private List<Industry> industryList; 
} 

行业

package forum3946102; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Industry { 
    private int id; 

    private String name; 
} 

jaxb.properties

为了指定莫西为您的JAXB提供者,你需要添加一个名为jaxb.properties文件在同一个包域类具有以下条目:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

演示

package forum3946102; 

import java.io.StringReader; 
import javax.xml.bind.*; 
import javax.xml.transform.stream.StreamSource; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Company.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     unmarshaller.setProperty("eclipselink.media-type", "application/json"); 
     unmarshaller.setProperty("eclipselink.json.include-root", false); 
     String jsonString = "{\"id\":\"0\",\"industries\":[{\"id\":\"0\",\"name\":\"Technologies\"}],\"name\":\"Google Inc.\"}"; 
     StreamSource jsonSource = new StreamSource(new StringReader(jsonString)); 
     Company company = unmarshaller.unmarshal(jsonSource, Company.class).getValue(); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty("eclipselink.media-type", "application/json"); 
     marshaller.setProperty("eclipselink.json.include-root", false); 
     marshaller.marshal(company, System.out); 
    } 

} 

输出

下面是从运行演示代码的输出:

{"id" : 0, "name" : "Google Inc.", "industries" : [{"id" : 0, "name" : "Technologies"}]} 

更多信息

0

向下钻取的JSONObject和换出一个需要JSONArray的区域。一旦创建,json putOpt将用新的替换旧的引用对象。

以前 “投资”:{ “子帐户”:{ “ID”: “SubAccountId_2_CORP”, “AllocPercent”: “100.0”, “产品代码”: “PC01”, “ProductFullName”: “产品全名” }}

“投资”:{ “子帐户”:[ { “ID”: “SubAccountId_2_CORP”, “AllocPercent”: “100.0”, “产品代码”: “PC01”, “ProductFullName”: “产品全名” } ]}

import org.json.JSONArray; 
import org.json.JSONObject; 
import org.json.XML; 
private static int PRETTY_PRINT_INDENT_FACTOR = 4; 

。 。 。 。

  try { 
      org.json.JSONObject xmlJSONObj = XML.toJSONObject(inBatchTrans.getINPUT_MESSAGE()); 

      try { 
       JSONArray subAcctArray = xmlJSONObj.getJSONObject("TXLife").getJSONObject("TXLifeRequest").getJSONObject("OLifE").getJSONObject("Holding").getJSONObject("Investment").getJSONArray("SubAccount"); 
       // Already JsonArray do nothing 
      } catch (Exception e) { 
       // convert to Array 
       JSONObject subAcctObj = xmlJSONObj.getJSONObject("TXLife").getJSONObject("TXLifeRequest").getJSONObject("OLifE").getJSONObject("Holding").getJSONObject("Investment").getJSONObject("SubAccount"); 
       JSONArray keys = subAcctObj.names(); 
       JSONArray values = subAcctObj.toJSONArray(keys); 

       JSONObject subAccount = new JSONObject(); 
       JSONArray subAccountList = new JSONArray(); 
       int key = keys.length(); 
       for (int i = 0; i < key; i++) { 
        subAccount.put(keys.get(i).toString(), values.get(i)); 
       } 
       subAccountList.put(0, subAccount); 
       xmlJSONObj.getJSONObject("TXLife").getJSONObject("TXLifeRequest").getJSONObject("OLifE").getJSONObject("Holding").getJSONObject("Investment").putOpt("SubAccount", subAccountList); 
      } 

      String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR); 
      System.out.println(jsonPrettyPrintString); 
     } catch (org.json.JSONException je) { 
      System.out.println(je.toString()); 
     }