Would it be possible if someone could help me parse this json result. I have retrieved the result as a string
{"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 Answers 4
Jackson. Simple and intuitive to use. For me the best available. Start out with Simple Data Binding, it will throw everything it finds in Maps and Lists.
Like this:
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> yourData = mapper.readValue(new File("yourdata.json"), Map.class);
That's all that's needed.
A good and quick introduction can be found here
And a full working example with your actual data:
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);
 }
}
Now, this whole Map juggling also illustrates Bozho's point pretty well, using full binding (by creating a Java class that reflects the content of the JSON data) will work better in the end.
3 Comments
The two best options that I know of are:
Using them is a matter of calling one method of the mapper. But remember that since Java is statically-typed, you may have to create an object that has the required structure. (You don't have to, but it feels more natural)
6 Comments
From http://www.json.org, under the Java section:
- http://www.json.org/java/index.html
- http://json-lib.sourceforge.net/
- http://code.google.com/p/json-simple/
- http://code.google.com/p/jjson/
Pick your poison
1 Comment
With Jackson, following is the approach I'd take. Since the coordinates in the JSON come in two different formats -- sometimes an object, sometimes an array -- the solution is mildly complicated with necessary custom deserialization processing.
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;
}