我正在尝试使用Jackson
映射器解析大型JSON到java对象。我有一个非常大的JSON,但遇到了这个小部分,不知道如何解析
这是JSON,它的格式看起来有点不同。我试图了解如何将其解析为对象。
{
"coordinates": [
[
[
-72.943068,
45.842298
],
[
-72.943075,
45.841859
]
]
]
}
我不明白它的格式,以及如何将其解析为对象。
答案 0 :(得分:1)
这取决于你的JSON有多大。如果可以将其加载到内存中,则可以使用最简单的方法:
解决方案1:
POJO课程:
class CoordinatesContainer {
private double[][][] coordinates;
public double[][][] getCoordinates() {
return coordinates;
}
public void setCoordinates(double[][][] coordinates) {
this.coordinates = coordinates;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder(1024);
for (double[] arrayItem : coordinates[0]) {
builder.append(Arrays.toString(arrayItem));
builder.append(", ");
}
return builder.toString();
}
}
用法:
ObjectMapper mapper = new ObjectMapper();
CoordinatesContainer coordinatesContainer = mapper.readValue(json, CoordinatesContainer.class);
System.out.println(coordinatesContainer);
以上程序打印:
[-72.943068, 45.842298], [-72.943075, 45.841859]
解决方案2:
但是如果您的JSON非常大并且无法将其加载到内存中,则应考虑Jackson Streaming feature。在这种情况下,您不应该创建POJO类并尝试处理每个元素" node"通过"节点":
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.Arrays;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
public class JsonProgram {
public static void main(String[] args) throws IOException {
File json = new File("/x/data.json");
JsonFactory jsonFactory = new JsonFactory();
JsonParser parser = jsonFactory.createParser(json);
// Skip all elements to first array
while (parser.nextToken() != JsonToken.START_ARRAY) {
}
parser.nextToken();
// First level
while (parser.nextToken() != JsonToken.END_ARRAY) {
// Skip inner start array element
parser.nextToken();
System.out.println();
System.out.println("NEXT ARRAY NODE");
BigDecimal first = parser.getDecimalValue();
// Go to second value
parser.nextToken();
BigDecimal second = parser.getDecimalValue();
// Skip inner end array element
parser.nextToken();
// Handle array item
System.out.println("First: " + first.toString());
System.out.println("Second: " + second.toString());
}
}
}
以上程序打印:
NEXT ARRAY NODE
First: -72.943068
Second: 45.842298
NEXT ARRAY NODE
First: -72.943075
Second: 45.841859
在我的示例中,我在Jackson
版本中使用了2.2.3
。
答案 1 :(得分:0)
创建一个json pojo映射器类
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"coordinates"
})
public class Example {
@JsonProperty("coordinates")
private List<List<List<Double>>> coordinates = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonProperty("coordinates")
public List<List<List<Double>>> getCoordinates() {
return coordinates;
}
@JsonProperty("coordinates")
public void setCoordinates(List<List<List<Double>>> coordinates) {
this.coordinates = coordinates;
}
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
然后将jsonString转换为pojo
Gson gson = new GsonBuilder().create();
Example r = gson.fromJson(jsonString, Example.class);