Помогите разобрать JSON в Java - PullRequest
4 голосов
/ 10 июля 2011

Было бы возможно, если бы кто-то мог помочь мне разобрать этот результат json. Я получил результат в виде строки

{"query":{"latitude":39.9889,"longitude":-82.8118},"timestamp":1310252291.861,"address":{"geometry":{"coordinates":[-82.81168367358264,39.9887910986731],"type":"Point"},"properties":{"address":"284 Macdougal Ln","distance":"0.02","postcode":"43004","city":"Columbus","county":"Franklin","province":"OH","country":"US"},"type":"Feature"}}

Ответы [ 4 ]

8 голосов
/ 10 июля 2011

Jackson . Простой и интуитивно понятный в использовании. Для меня лучшее из доступных. Начните с Простое связывание данных , оно выбросит все, что находит в Картах и ​​Списках.

Как это:

ObjectMapper mapper = new ObjectMapper();
Map<String,Object> yourData = mapper.readValue(new File("yourdata.json"), Map.class);

Это все, что нужно.

Хорошее и быстрое введение можно найти здесь

И полный рабочий пример с вашими фактическими данными:

import java.io.IOException;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;

public class Main {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        Map<?,?> rootAsMap = mapper.readValue(
                "{\"query\":{\"latitude\":39.9889,\"longitude\":-82.8118},\"timestamp\":1310252291.861,\"address\":{\"geometry\":{\"coordinates\":[-82.81168367358264,39.9887910986731],\"type\":\"Point\"},\"properties\":{\"address\":\"284 Macdougal Ln\",\"distance\":\"0.02\",\"postcode\":\"43004\",\"city\":\"Columbus\",\"county\":\"Franklin\",\"province\":\"OH\",\"country\":\"US\"},\"type\":\"Feature\"}}".getBytes(),
                Map.class);
        System.out.println(rootAsMap);
        Map query = (Map) rootAsMap.get("query");
        Map address = (Map) rootAsMap.get("address");
        Map addressProperties = (Map) address.get("properties");
        String county = (String) addressProperties.get("county");
        System.out.println("County is " + county);
    }

}

Теперь все это жонглирование картой также хорошо иллюстрирует точку зрения Божо, поскольку полное связывание (путем создания Java-класса, отражающего содержимое данных JSON) в итоге будет работать лучше.

3 голосов
/ 10 июля 2011

Два лучших варианта, которые я знаю:

Использование их заключается в вызове одного метода картографа. Но помните, что поскольку Java имеет статическую типизацию, вам, возможно, придется создать объект, имеющий требуемую структуру. (Вам не нужно, но это кажется более естественным)

2 голосов
/ 10 июля 2011
1 голос
/ 10 июля 2011

С Джексоном я бы выбрал следующий подход.Поскольку координаты в JSON представлены в двух разных форматах - иногда объект, иногда массив - решение слегка усложняется необходимой обработкой десериализации.

import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;

import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.ObjectCodec;
import org.codehaus.jackson.Version;
import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
import org.codehaus.jackson.map.DeserializationContext;
import org.codehaus.jackson.map.JsonDeserializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.module.SimpleModule;
import org.codehaus.jackson.node.ArrayNode;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
    mapper.registerModule(
      new SimpleModule("CoordinatesDeserializer", Version.unknownVersion())
        .addDeserializer(Coordinates.class, new CoordinatesDeserializer()));

    Result result = mapper.readValue(new File("input.json"), Result.class);
    System.out.println(mapper.writeValueAsString(result));
  }
}

class CoordinatesDeserializer extends JsonDeserializer<Coordinates>
{
  @Override
  public Coordinates deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
  {
    ObjectCodec codec = jp.getCodec();
    JsonNode node = codec.readTree(jp);
    if (node.isObject())
    {
      ObjectMapper mapper = new ObjectMapper();
      mapper.setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
      return mapper.readValue(node, Coordinates.class);
    }
    // else it's an array
    ArrayNode array = (ArrayNode) node;
    Coordinates coordinates = new Coordinates();
    coordinates.latitude = codec.treeToValue(array.get(0), BigDecimal.class);
    coordinates.latitude = codec.treeToValue(array.get(1), BigDecimal.class);
    return coordinates;
  }
}

class Result
{
  Coordinates query;
  BigDecimal timestamp;
  Address address;
}

class Coordinates
{
  BigDecimal latitude;
  BigDecimal longitude;
}

class Address
{
  String type;
  Geometry geometry;
  AddressDetails properties;
}

class Geometry
{
  String type;
  Coordinates coordinates;
}

class AddressDetails
{
  String address;
  BigDecimal distance;
  String postcode;
  String city;
  String county;
  String province;
  String country;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...