2010-10-15 5 views
4


Я пытаюсь скопировать скобки в списках, которые содержат только один элемент.JAXB JSON скобки на массивах

Я хочу что-то вроде этого:
{"id": "0", "industries": [{"id": "0", "name": "Technologies"}], "name": " Google Inc. "}

Но я получаю:
{" id ":" 0 "," industries ": {" id ":" 0 "," name ":" Technologies "}," name ": "Google Inc."}

Вот мой Entity:

@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

Я сделал STUFF наоборот: с помощью JAXB для создания Java-классов из файлов XSD схемы. Я просмотрел созданные классы с полями коллекции, и у них нет конкретных аннотаций к ним.

Также вы можете хотите попробовать JSON Lib: http://json-lib.sourceforge.net/

вы могли бы сделать что-то вроде:

jsonString = JSONObject.fromObject(pojoObject) 

, которые будут генерировать JSon строку, которая будет включать, например, коллекции сложных типов.

Затем вы можете отправить jsonString, например, HttpServletResponse.

Я бы рекомендовал сериализовать объекты DTO, а не сериализовывать объекты объекта.

1

благодарит за вашу помощь, но я нашел ответ. Вам действительно нужно указать JAXBContextResolver, которые определяют естественную конфигурацию JSON. Вам необходимо предоставить список типов для каждого контейнера, который необходимо преобразовать в 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-привязки. Он будет правильно маршалировать коллекции размером 1, завернутые в массив JSON. Ниже приведен полный пример.

Компания

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

Для того, чтобы указать Moxy в качестве поставщика 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 заменит старый ссылочный объект новым.

Перед "Инвестиции": { "субсчет": { "идентификатор": "SubAccountId_2_CORP", "AllocPercent": "100,0", "ProductCode": "PC01", "ProductFullName": "Продукт Полное имя" }}

После "Инвестиции": { "субсчет": [ { "ид": "SubAccountId_2_CORP", "AllocPercent": "100.0","ProductCode": "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()); 
     } 
Смежные вопросы