帮助解析java中的JSON
如果有人能帮我解析这个json结果,有可能吗。我已将结果检索为字符串帮助解析java中的JSON,java,json,Java,Json,如果有人能帮我解析这个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","di
{"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"}}
来自,在Java部分下:
选择你的毒药我知道的两个最佳选择是:
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> yourData = mapper.readValue(new File("yourdata.json"), Map.class);
ObjectMapper mapper=new ObjectMapper();
Map yourData=mapper.readValue(新文件(“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);
}
}
import java.io.IOException;
导入java.util.Map;
导入org.codehaus.jackson.map.ObjectMapper;
公共班机{
公共静态void main(字符串[]args)引发IOException{
ObjectMapper mapper=新的ObjectMapper();
Map rootAsMap=mapper.readValue(
“,”时间戳:1310252291.861,”地址:“:,,,,,,“地址:“,,,,,,,,,,,,“地址::“几何图形::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,哦,“,”国家\“:\”美国\“},\”类型\“:\”功能\“}}”。getBytes(),
地图(类别),;
System.out.println(rootAsMap);
映射查询=(Map)rootAsMap.get(“查询”);
映射地址=(Map)rootAsMap.get(“地址”);
Map addressProperties=(Map)address.get(“属性”);
String county=(String)addressProperties.get(“county”);
System.out.println(“县为”+县);
}
}
现在,整个地图的处理也很好地说明了Bozho的观点,使用完全绑定(通过创建一个反映JSON数据内容的Java类)最终会更好。由于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;
}
导入java.io.File;
导入java.io.IOException;
导入java.math.BigDecimal;
导入org.codehaus.jackson.JsonNode;
导入org.codehaus.jackson.JsonParser;
导入org.codehaus.jackson.JsonProcessingException;
导入org.codehaus.jackson.ObjectCodec;
导入org.codehaus.jackson.Version;
导入org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
导入org.codehaus.jackson.map.DeserializationContext;
导入org.codehaus.jackson.map.jsonderializer;
导入org.codehaus.jackson.map.ObjectMapper;
导入org.codehaus.jackson.map.module.SimpleModule;
导入org.codehaus.jackson.node.ArrayNode;
公务舱杰克逊福
{
公共静态void main(字符串[]args)引发异常
{
ObjectMapper mapper=新的ObjectMapper();
setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
mapper.registerModule(
新的SimpleModule(“CoordinatesDeserializer”,Version.unknownVersion())
.addDeserializer(Coordinates.class,new Coordinates Deserializer());
Result=mapper.readValue(新文件(“input.json”)、Result.class);
System.out.println(mapper.writeValueAsString(result));
}
}
类协调反序列化程序扩展JsonDeserializer
{
@凌驾
公共坐标反序列化(JsonParser jp,反序列化上下文ctxt)引发IOException,JsonProcessingException
{
ObjectCodec codec=jp.getCodec();
JsonNode=codec.readTree(jp);
if(node.isObject())
{
ObjectMapper mapper=新的ObjectMapper();
setVisibilityChecker(mapper.getVisibilityChecker().withFieldVisibility(Visibility.ANY));
返回mapper.readValue(节点,坐标,类);
}
//否则它就是一个数组
ArrayNode数组=(ArrayNode)节点;
坐标=新坐标();
coordinates.latitude=codec.treeToValue(array.get(0),BigDecimal.class);
coordinates.latitude=codec.treeToValue(array.get(1),BigDecimal.class);
返回坐标;
}
}
班级成绩
{
坐标查询;
大十进制时间戳;
地址;
}
类坐标
{
大十进制纬度;
大十进制经度;
}
班级地址
{
字符串类型;
几何;
地址详细信息和属性;
}
类几何
{
字符串类型;
坐标;
}
类地址详细信息
{
字符串地址;
大十进制距离;
字符串邮政编码;
字符串城市;
弦县;
弦省;
弦国;
}
不,您不需要,请参阅我回复中指向Jackson simple databinding的链接。@fvu您不需要,是的,但在大多数情况下更好,我想我对最佳路线有点困惑。似乎每个结果都不一样。我想我需要澄清对象和数组是什么,每个结果包含什么。@bozho简单数据绑定的简单性让人们很容易开始,“升级”到完整数据绑定是很自然的事情。@flu你能举出一些好的例子或教程吗?我只需要一个快速启动。:)这是一个最差的JSON到/从Java库的示例,对吗?Jackson是我见过的唯一一个JSON到/从Java库的示例,它将任意复杂的JSON对象反序列化为一个映射,只需一行代码。请注意,如果在调用readValue时使用映射参数化类型引用,则对Map和String的强制转换将是不必要的。TypeReference mapType=新的TypeReference(){};Map result=new ObjectMapper().readValue(新文件(“input.json”),mapType@fvu