Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222) экспертная группа.
Если вы в конечном итоге ищете способ взаимодействия с JSON с использованием реализации JAXB (JSR-222), то ниже описано, как это можно сделать с помощью MOXy.Jettison - интересная библиотека, но есть некоторые проблемы, с которыми вы можете столкнуться при ее использовании:
Демо
Используются только стандартные API Java SE.Есть два специфических свойства MOXy, которые нужно установить на Unmarshaller
: "eclipselink.media-type"
, чтобы указать "application/json"
, и "eclipselink.json.include-root"
, чтобы указать, что нет корневого узла.
package forum9924567;
import java.io.StringReader;
import java.util.ArrayList;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
public class Demo {
private static final String s ="{\"appUsage\":[{\"appName\":\"ANDROID\",\"totalUsers\":\"0\"},{\"appName\":\"IOS\",\"totalUsers\":\"4\"}]}";
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setProperty("eclipselink.media-type", "application/json");
unmarshaller.setProperty("eclipselink.json.include-root", false);
StreamSource json = new StreamSource(new StringReader(s));
Root root = unmarshaller.unmarshal(json, Root.class).getValue();
ArrayList<MiAppUsage> customer = root.appUsage;
for(MiAppUsage miAppUsage : customer) {
System.out.print(miAppUsage.appName);
System.out.print(' ');
System.out.println(miAppUsage.totalUsers);
}
}
}
Root
Я должен был представить этот класс, чтобы удовлетворить ваш вариант использования.Мы могли бы исключить этот класс, если бы ваш JSON выглядел следующим образом: [{"appName":"ANDROID","totalUsers":"0"},{"appName":"IOS","totalUsers":"4"}]
.
package forum9924567;
import java.util.ArrayList;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
ArrayList<MiAppUsage> appUsage;
}
MiAppUsage
package forum9924567;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class MiAppUsage {
String appName;
int totalUsers;
}
jaxb.properties
Чтобы указать MOXy в качестве вашего JAXB-провайдера, вам нужно добавить файл с именем java.properties
со следующей записью в том же пакете, что и классы вашего домена:
javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory
Выход
Ниже приводится вывод демонстрационного кода:
ANDROID 0
IOS 4
Для получения дополнительной информации