JAXB JSON принудительные скобки для массивов - PullRequest
4 голосов
/ 16 октября 2010


Я пытаюсь заключить скобки в списки, содержащие только один элемент.

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

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

Вот моя сущность:

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

 private String name;
 private String description;

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

    [...]

И наконец, мой JAXB Context Resolver:

public JAXBContextResolver() throws Exception {

MappedBuilder builder = JSONConfiguration.mapped ();builder.arrays ( "отрасль");builder.rootUnwrapping (true);

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

Ответы [ 4 ]

1 голос
/ 01 февраля 2011

спасибо за вашу помощь, но я нашел ответ. На самом деле вам нужно указать JAXBContextResolver, который указывает естественную конфигурацию JSON. Вам необходимо предоставить список типов каждого контейнера, который необходимо преобразовать в JSON. В этом примере вы можете видеть, что я указал GetCompanyResponse, который является контейнером Company.

@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;
    }
}
1 голос
/ 12 апреля 2012

Примечание: Я 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 голосов
/ 20 июня 2017

Разверните JSONObject и замените область, которая должна быть JSONArray. После создания json putOpt заменит старый ссылочный объект новым.

До «Инвестиции»: {«Субсчет»: { "id": "SubAccountId_2_CORP", «AllocPercent»: «100,0», «Код продукта»: «PC01», "ProductFullName": "Полное имя продукта" }}

* После 1010 * «Инвестиции»: {«SubAccount»: [ { "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());
        }
0 голосов
/ 16 октября 2010

Я не слишком уверен в этом, но попробуйте удалить аннотацию @XMLElement для industryList

Я сделал все наоборот: использование jaxb для генерации классов Java изфайлы схемы xsd.Я посмотрел на сгенерированные классы с полями коллекции, и у них нет никаких конкретных аннотаций к ним.

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

вы можете сделать что-то вроде:

jsonString = JSONObject.fromObject(pojoObject)

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...