Java'da JSON dizelerini ayrıştırmaya ve anahtar-değer çiftlerini bulmaya çalışıyorum, böylece JSON dizesinin nesne yapısı bilinmediğinden JSON nesnesinin yaklaşık yapısını belirleyebilirim.
Örneğin, bir yürütme aşağıdaki gibi bir JSON dizesine sahip olabilir:
{"id" : 12345, "days" : [ "Monday", "Wednesday" ], "person" : { "firstName" : "David", "lastName" : "Menoyo" } }
Ve bunun gibi bir başkası:
{"url" : "http://someurl.com", "method" : "POST", "isauth" : false }
Çeşitli JSON öğeleri arasında nasıl geçiş yapabilirim ve anahtarları ve değerlerini nasıl belirleyebilirim? Jackson-core'un [
JsonParser`](http://fasterxml.github.io/jackson-core/javadoc/2.2.0/com/fasterxml/jackson/core/JsonParser.html) uygulamasına baktım. Bir sonraki "token"'ı nasıl yakalayabileceğimi ve ne tür bir token olduğunu (yani, alan adı, değer, dizi başlangıcı, vb.) nasıl belirleyebileceğimi görüyorum, ancak, gerçek token'ın değerini nasıl yakalayacağımı bilmiyorum.
Örneğin:
public void parse(String json) {
try {
JsonFactory f = new JsonFactory();
JsonParser parser = f.createParser(json);
JsonToken token = parser.nextToken();
while (token != null) {
if (token.equals(JsonToken.START_ARRAY)) {
logger.debug("Start Array : " + token.toString());
} else if (token.equals(JsonToken.END_ARRAY)) {
logger.debug("End Array : " + token.toString());
} else if (token.equals(JsonToken.START_OBJECT)) {
logger.debug("Start Object : " + token.toString());
} else if (token.equals(JsonToken.END_OBJECT)) {
logger.debug("End Object : " + token.toString());
} else if (token.equals(JsonToken.FIELD_NAME)) {
logger.debug("Field Name : " + token.toString());
} else if (token.equals(JsonToken.VALUE_FALSE)) {
logger.debug("Value False : " + token.toString());
} else if (token.equals(JsonToken.VALUE_NULL)) {
logger.debug("Value Null : " + token.toString());
} else if (token.equals(JsonToken.VALUE_NUMBER_FLOAT)) {
logger.debug("Value Number Float : " + token.toString());
} else if (token.equals(JsonToken.VALUE_NUMBER_INT)) {
logger.debug("Value Number Int : " + token.toString());
} else if (token.equals(JsonToken.VALUE_STRING)) {
logger.debug("Value String : " + token.toString());
} else if (token.equals(JsonToken.VALUE_TRUE)) {
logger.debug("Value True : " + token.toString());
} else {
logger.debug("Something else : " + token.toString());
}
token = parser.nextToken();
}
} catch (Exception e) {
logger.error("", e);
}
}
Jacksonveya başka bir kütüphanede (
gsonveya
simple-json`) bir ağaç üreten veya json öğeleri arasında dolaşıp değerlere ek olarak gerçek anahtar adlarını elde etmeyi sağlayan bir sınıf var mı?
Jackson'ın yerleşik ağaç modeli özelliğine bir göz atın]1.
Ve kodunuz şöyle olacak:
public void parse(String json) {
JsonFactory factory = new JsonFactory();
ObjectMapper mapper = new ObjectMapper(factory);
JsonNode rootNode = mapper.readTree(json);
Iterator<Map.Entry<String,JsonNode>> fieldsIterator = rootNode.fields();
while (fieldsIterator.hasNext()) {
Map.Entry<String,JsonNode> field = fieldsIterator.next();
System.out.println("Key: " + field.getKey() + "\tValue:" + field.getValue());
}
}
Eğer farklı bir kütüphane sizin için uygunsa, org.json'i deneyebilirsiniz:
JSONObject object = new JSONObject(myJSONString);
String[] keys = JSONObject.getNames(object);
for (String key : keys)
{
Object value = object.get(key);
// Determine type of value and do something with it...
}
Jackson'dan gelen bir "Harita" sizi tatmin eder mi?
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> map = objectMapper.readValue(jsonString, new TypeReference<HashMap<String,Object>>(){});
Ya da belki bir JsonNode
?
JsonNode jsonNode = objectMapper.readTree(String jsonString)