我知道有很多JSON解析库。但经过一番搜索,我似乎找不到一种简单的方法来解析java中的json数据。
我知道最好的做法是拥有一个合适的模型,以便api请求直接映射到一个对象。
但是让我说我有一个JSONObject:
JSONObject c = contacts.getJSONObject(i);
String id = c.getString("id");
String name = c.getString("name");
String email = c.getString("email");
String address = c.getString("address");
String gender = c.getString("gender");
我以前使用以下语法来获取数据:
contacts["id]
contacts["name"]
我个人更喜欢使用后者的可读性,特别是当你开始进入嵌套数据时,例如:
articleItem["_embedded"]["wp:featuredmedia"][0]["media_details"]["sizes"]["medium"]["source_url"]
在我看来,获取这些数据的java代码真的很难看。
b = a.getJSONObject("_embedded")
c = b.getJSONObject("wp:fea....")
d = c.get(0)
e = d.getJSONObject("media..details")
f = e.getJSONObject("sizes")
g = f.getJSONObject("medium")
h = ............
是一种在java中做一个衬里json的方法吗?
quicktype将直接从JSON样本数据生成您的类和转换器;您可能会认为这是“像其他语言一样阅读JSON”,因为您只需获得一个POJO实例,您可以像下面这样访问它:
ArticleItem item = Converter.fromJsonString(jsonString);
String url = item.getEmbedded().getWpFeaturedmedia()[0]
.getMediaDetails().getSizes()
.getMedium().getSourceUrl();
我假设你的JSON是这样的:
{
"_embedded": {
"wp:featuredmedia": [
{
"media_details": {
"sizes": {
"medium": {
"source_url": "https://quicktype.io"
}
}
}
}
]
}
}
这是quicktype generated的完整代码:
package io.quicktype;
import java.util.Map;
import java.io.IOException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.core.JsonProcessingException;
public class Converter {
// Serialize/deserialize helpers
public static ArticleItem fromJsonString(String json) throws IOException {
return getObjectReader().readValue(json);
}
public static String toJsonString(ArticleItem obj) throws JsonProcessingException {
return getObjectWriter().writeValueAsString(obj);
}
private static ObjectReader reader;
private static ObjectWriter writer;
private static void instantiateMapper() {
ObjectMapper mapper = new ObjectMapper();
reader = mapper.reader(ArticleItem.class);
writer = mapper.writerFor(ArticleItem.class);
}
private static ObjectReader getObjectReader() {
if (reader == null) instantiateMapper();
return reader;
}
private static ObjectWriter getObjectWriter() {
if (writer == null) instantiateMapper();
return writer;
}
}
// ArticleItem.java
package io.quicktype;
import java.util.Map;
import com.fasterxml.jackson.annotation.*;
public class ArticleItem {
private Embedded embedded;
@JsonProperty("_embedded")
public Embedded getEmbedded() { return embedded; }
@JsonProperty("_embedded")
public void setEmbedded(Embedded value) { this.embedded = value; }
}
// Embedded.java
package io.quicktype;
import java.util.Map;
import com.fasterxml.jackson.annotation.*;
public class Embedded {
private WpFeaturedmedia[] wpFeaturedmedia;
@JsonProperty("wp:featuredmedia")
public WpFeaturedmedia[] getWpFeaturedmedia() { return wpFeaturedmedia; }
@JsonProperty("wp:featuredmedia")
public void setWpFeaturedmedia(WpFeaturedmedia[] value) { this.wpFeaturedmedia = value; }
}
// WpFeaturedmedia.java
package io.quicktype;
import java.util.Map;
import com.fasterxml.jackson.annotation.*;
public class WpFeaturedmedia {
private MediaDetails mediaDetails;
@JsonProperty("media_details")
public MediaDetails getMediaDetails() { return mediaDetails; }
@JsonProperty("media_details")
public void setMediaDetails(MediaDetails value) { this.mediaDetails = value; }
}
// MediaDetails.java
package io.quicktype;
import java.util.Map;
import com.fasterxml.jackson.annotation.*;
public class MediaDetails {
private Sizes sizes;
@JsonProperty("sizes")
public Sizes getSizes() { return sizes; }
@JsonProperty("sizes")
public void setSizes(Sizes value) { this.sizes = value; }
}
// Sizes.java
package io.quicktype;
import java.util.Map;
import com.fasterxml.jackson.annotation.*;
public class Sizes {
private Medium medium;
@JsonProperty("medium")
public Medium getMedium() { return medium; }
@JsonProperty("medium")
public void setMedium(Medium value) { this.medium = value; }
}
// Medium.java
package io.quicktype;
import java.util.Map;
import com.fasterxml.jackson.annotation.*;
public class Medium {
private String sourceURL;
@JsonProperty("source_url")
public String getSourceURL() { return sourceURL; }
@JsonProperty("source_url")
public void setSourceURL(String value) { this.sourceURL = value; }
}
您可以使用ObjectMapper将Json转换为Java对象,这将使您能够根据您的用途使用或解析数据。
https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/
在Java中读取json对象是不可能的,就好像它是另一种语言,即javascript。
唯一的方法是将json转换为Java模型对象,然后通过Java东西访问它。
使用Google gson(https://github.com/google/gson)非常简单。
在您的情况下,您必须实现与处理的json相关的所有类并启动:
Gson gson = new Gson();
Contact contact = gson.fromJson(jsonfile)
显然,您还必须实现所有嵌套的Contact类,即Embedded类:
public class Contact {
.....
Embedded _embedded;
....
}