Как мне разобрать данные, чтобы создать объект в Java? - PullRequest
3 голосов
/ 18 апреля 2011

Я ищу, как разобрать данные, полученные с сайта JSON.Вот пример данных.

   { "weatherObservation":{ 
  "clouds": "n/a",
  "weatherCondition": "n/a",
  "observation": "KIAD 181852Z 18005KT 10SM CLR 21/06 A2992 RMK AO2 SLP132 T02110056",
  "windDirection": 180,
  "ICAO": "KIAD",
  "seaLevelPressure": 1013.2,
  "elevation": 93,
  "countryCode": "US",
  "lng": -77.45,
  "temperature": "21.1",
  "dewPoint": "5.6",
  "windSpeed": "05",
  "humidity": 36,
  "stationName": "Washington DC, Washington-Dulles International Airport",
  "datetime": "2011-04-18 18:52:00",
  "lat": 38.93333333333333 }}

Я хочу создать объект ИКАО со всеми этими данными и заполнить атрибуты вышеуказанным содержимым.

public class ICAO {

    String clouds;
    String weatherCondition;
    String observation;
    int windDirection;
    String ICAOid;
    int seaLevelPressure;
    int elevation;
    String countryCode;
    double lng;
    double temperature;
    double dewpoint;
    int windSpeed;
    int humidity;
    String stationName;
    String date;
    double lat;


public ICAO(String _clouds,String _weatherCondition,String _observation,int _windDirection,String _ICAOid,int _seaLevelPressure,int _elevation, String _countryCode, 
    double _lng, double _temperature, double _dewpoint, int _windSpeed, int _humidity, String _stationName, String _date, double _lat)
{
    clouds = _clouds;
    weatherCondition = _weatherCondition;
    observation = _observation;
    windDirection = _windDirection;
    ICAOid = _ICAOid;
    seaLevelPressure = _seaLevelPressure;
    elevation = _elevation;
    countryCode = _countryCode;
    lng = _lng;
    temperature = _temperature;
    dewpoint = _dewpoint;
    windSpeed = _windSpeed;
    humidity = _humidity;
    stationName = _stationName;
    date = _date;
    lat = _lat;
}

Ответы [ 5 ]

2 голосов
/ 27 апреля 2011

Вы можете использовать комбинацию JAXB и JSON для этого варианта использования:

ICAO

import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="weatherObservation")
@XmlAccessorType(XmlAccessType.FIELD)
public class ICAO {

    String clouds;
    String weatherCondition;
    String observation;
    int windDirection;
    @XmlElement(name="ICAO") String ICAOid;
    int seaLevelPressure;
    int elevation;
    String countryCode;
    double lng;
    double temperature;
    double dewpoint;
    int windSpeed;
    int humidity;
    String stationName;
    @XmlElement(name="datetime") String date;
    double lat;

}

Demo

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.XMLStreamReader;

import org.codehaus.jettison.json.JSONObject;
import org.codehaus.jettison.mapped.Configuration;
import org.codehaus.jettison.mapped.MappedNamespaceConvention;
import org.codehaus.jettison.mapped.MappedXMLStreamReader;

public class Demo {

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

        JSONObject obj = new JSONObject("{\"weatherObservation\":{\"clouds\": \"n/a\",\"weatherCondition\": \"n/a\",\"observation\": \"KIAD 181852Z 18005KT 10SM CLR 21/06 A2992 RMK AO2 SLP132 T02110056\",\"windDirection\": 180,\"ICAO\": \"KIAD\",\"seaLevelPressure\": 1013.2,\"elevation\": 93,\"countryCode\": \"US\",\"lng\": -77.45,\"temperature\": \"21.1\",\"dewPoint\": \"5.6\",\"windSpeed\": \"05\",\"humidity\": 36,\"stationName\": \"Washington DC, Washington-Dulles International Airport\",\"datetime\": \"2011-04-18 18:52:00\",\"lat\": 38.93333333333333 }}");
        Configuration config = new Configuration();
        MappedNamespaceConvention con = new MappedNamespaceConvention(config);
        XMLStreamReader xmlStreamReader = new MappedXMLStreamReader(obj, con);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        ICAO icao = (ICAO) unmarshaller.unmarshal(xmlStreamReader);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(icao, System.out);
    }
}

Для получения дополнительной информации:

2 голосов
/ 18 апреля 2011

У меня был хороший опыт работы с Google Gson .

Если ваш класс ICAO совпадает с вашими данными JSON, тогда преобразование должно быть таким же простым, как вызов

Gson gson = new Gson();
gson.fromJson(JSONstring, ICAO.class);

Для более подробной информации прочитайте руководство пользователя .

1 голос
/ 18 апреля 2011

Вы можете попробовать использовать JSONTokener из JSON-Java

0 голосов
/ 27 апреля 2011

Мне повезло, используя классы JSON, найденные здесь:

http://json.org/java/

Вы бы по существу создали экземпляр JSONObject, подобный этому:

JSONObject jsonObject = new JSONObject(data);

ГдеДанные - это строковое представление ваших данных JSON.Оттуда вы можете использовать методы:

get (String) - чтобы получить конкретное свойство.

keys () - для получения перечисления переведенных ключей.

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

0 голосов
/ 18 апреля 2011

Или вы можете использовать Джексон .Он выполнит сопоставление объектов с классами bean-pattern для вас.

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