Использование JAXB с Google Android - PullRequest
30 голосов
/ 28 марта 2011

Мне нужно разобрать java-объекты, которые передаются через xml. Я хочу использовать для этих целей инфраструктуру JAXB, потому что я предварительно аннотировал (используя JAXB) java-класс.

Возможно ли это в принципе?

InputStream input = entity.getContent();
JAXBContext jc = JAXBContext.newInstance(new Class[] {Response.LoginResponse.class});
Unmarshaller un = jc.createUnmarshaller();
LoginResponse response = (LoginResponse)un.unmarshal(input);

в строке 4 у меня предупреждение: «невозможно разрешить статический метод 282 JAXBContext ...» а затем ВМ вылетает

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

25 голосов
/ 28 марта 2011

Я не совсем решаю вашу проблему, но JAXB по умолчанию не включен в Android, и библиотека будет стоить вам 9 (!) МБ вашего apk. Попробуйте вместо SimpleXML . Он имеет аналогичные способности и намного более легкий.

24 голосов
/ 26 октября 2012

У меня была такая же проблема: я хотел использовать кучу классов JAXB в процессе анализа ответов веб-сервера XML (и, для меня, JSON).

Я написал вики-страницу для Разбор XML и JSON на Android , в котором описывается решение этой проблемы и пошаговые инструкции.

Для ясности - я бы советовал использовать JSON вместо XML на Android всякий раз, когдавозможный.У JSON существенные преимущества в производительности *.

Подводя итог моему решению об использовании классов JAXB для синтаксического анализа JSON и XML:

В итоге я удалил все аннотации и javax.xml.* импортирует из классов JAXB (немного проще, чем повторное аннотирование классов для SimpleXML - плюс, вы также можете анализировать ответы JSON) для создания настоящих POJO, а затем используйте Jackson с модифицированными версиями библиотек XML, которые Джексонзависит от.

Модификация библиотек XML необходима, потому что Android не включает в платформу обязательные классы XML, и он будет жаловаться , если вы попытаетесь включить классы в защищенное пространство имен javax.xmlкак библиотеки в вашем проекте.

Сначала я удалил аннотации XML и импортировал их вручную, но затем закончил , автоматизируя процесс с помощью скриптов ant .

К счастью, вы можете автоматизироватьпроцесс модификации библиотеки XML.Я написал подробный пост о Модификации библиотек XML для Android (на который ссылается полный учебник), в котором описано, как переместить соответствующие классы в новое незащищенное пространство имен с помощью утилиты Jar Jar Links .

Если вы хотите использовать Jackson на Android, я также создал модифицированную версию проектов jackson-dataformat-android, aalto-xml, stax-api и stax2-api для Android, которую вы можете свободно использовать.использовать.

Вот пример того, что вы бы включили в pom.xml, чтобы включить зависимости через Maven:

<dependencies>              
    <!-- Using Jackson for parsing -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.1.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.1.2</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.1.2</version>
    </dependency>   
    <!-- XML parsing  -->
    <!-- So many problems with XML and Android...
         Below XML libraries have been modified using JarJar
         and are NOT the same as their J2SE counterparts,
         hence the added "-android" to the artifactId
         See:
         https://github.com/CUTR-at-USF/SiriRestClient/wiki/Modifying-XML-libraries-for-Android
      -->        
    <dependency>
        <groupId>edu.usf.cutr.android.xml</groupId>
        <artifactId>jackson-dataformat-xml-android</artifactId>
        <version>2.1.2</version>
    </dependency>
    <dependency>
        <groupId>edu.usf.cutr.android.xml</groupId>
        <artifactId>stax2-api-android</artifactId>
        <version>3.1.1</version>
    </dependency>
    <dependency>
        <groupId>edu.usf.cutr.android.xml</groupId>
        <artifactId>stax-api-android</artifactId>
        <version>1.0-2</version>
    </dependency>
    <dependency>
        <groupId>edu.usf.cutr.android.xml</groupId>
        <artifactId>aalto-xml-android</artifactId>
        <version>0.9.8</version>
    </dependency>        
</dependencies>    

<repositories>
    <!-- CUTR Android XML libraries Releases -->
    <repository>
      <id>cutr-releases</id>
      <url>https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/releases</url>
    </repository>      
</repositories>

См. эту страницу для получения более подробной информации об этих библиотеках..

Вы можете загрузить файлы JAR из соответствующих каталогов здесь , если хотите включить их непосредственно в свой проект.

Вы также можете проверить открытыеsource Приложение «SIRI REST Client» , которое использует эти библиотеки для рабочего примера.

EDIT

Если вы используете Gradle, ваш build.gradle будет выглядеть так:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.9.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
    maven {
        // CUTR SNAPSHOTs
        url "https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/snapshots"
    }
    maven {
        // CUTR Releases
        url "https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/releases"
    }
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.1"
    ...
}

dependencies {
    ...
    // Normal Jackson libraries
    compile 'com.fasterxml.jackson.core:jackson-core:2.1.2'
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.1.2'
    compile 'com.fasterxml.jackson.core:jackson-databind:2.1.2'
    // Repackaged XML-specific libraries
    compile 'edu.usf.cutr.android.xml:jackson-dataformat-xml-android:2.1.2'
    compile 'edu.usf.cutr.android.xml:stax2-api-android:3.1.1'
    compile 'edu.usf.cutr.android.xml:stax-api-android:1.0-2'
    compile 'edu.usf.cutr.android.xml:aalto-xml-android:0.9.8'
    ...       
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...