像Java中的其他语言一样阅读JSON

问题描述 投票:-3回答:3

我知道有很多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的方法吗?

java json
3个回答
1
投票

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; }
}

0
投票

您可以使用ObjectMapper将Json转换为Java对象,这将使您能够根据您的用途使用或解析数据。

https://www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/


0
投票

在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;
....
}
© www.soinside.com 2019 - 2024. All rights reserved.