java如何将json的json转换为json的数组?

问题描述 投票:0回答:1

我的个人项目遇到了一些问题。 我从网址获取数据字段:http://ddragon.leagueoflegends.com/cdn/13.15.1/data/en_US/champion.json

使用以下代码:

import DataHandlers.ChampionsJson;

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.util.concurrent.ExecutionException;


public class ChampionsDataScheduler extends Thread{
    @Override
    public void run(){
        while(true){

            try {
                var client = HttpClient.newHttpClient();

                var request = HttpRequest.newBuilder(
                                URI.create("http://ddragon.leagueoflegends.com/cdn/13.15.1/data/en_US/champion.json"))
                        .header("accept", "application/json")
                        .build();

                var responseFuture = client.sendAsync(request, new JsonBodyHandler<>(ChampionsJson.class));
                var response = responseFuture.get();
                var data = response.body().get().championsData;

                System.out.println(data);
                Thread.sleep(1000);

            } catch (InterruptedException | ExecutionException e) {
                throw new RuntimeException(e);
            }


        }
    }
}

使用这个类:

package DataHandlers;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;

import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public class ChampionsJson {
    public final JsonNode championsData;

    @JsonIgnoreProperties(ignoreUnknown = true)
    public ChampionsJson(@JsonProperty("data") JsonNode championsData) {
        this.championsData = championsData;
    }
}

我正在尝试将每个冠军(接收到的 json 中的每个值)注入到以下对象并创建它的数组:

package DataHandlers;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.List;
@JsonIgnoreProperties(ignoreUnknown = true)
public class ChampionsData {
    public final String id;
    public final String name;
    public final String blurb;
    public final List image;
    public final String title;

    @JsonIgnoreProperties(ignoreUnknown = true)
    public ChampionsData(@JsonProperty("id") String id,
                @JsonProperty("name") String name,
                @JsonProperty("blurb") String blurb,
                @JsonProperty("image") List image,
                @JsonProperty("title") String title) {
        this.id = id;
        this.name = name;
        this.title = title;
        this.blurb = blurb;
        this.image = image;
    }


}

但是我没有这样做,因为我将 json 作为 json 字符串获取,并且我还没有找到正确解析它的方法。 知道怎么做吗?也许有更好的方法吗?

如果您想获得更多上下文,我的最终目标是将 ChampionsData 对象数组转换为 morphia 对象数组并将其插入到 mongo。

java json mongodb jackson morphia
1个回答
0
投票

http://ddragon.leagueoflegends.com/cdn/13.15.1/data/en_US/champion.json
处的数据是具有单个键
data
的单个JSON对象。
data
是一个大约有 164 个子字段的对象,每个子字段似乎都是一个冠军的名字。没有数组;您必须迭代
data
字段。

如果目标是将此数据插入 MongoDB,那么我建议将每个冠军制作为单独的文档。子字段携带大量标识信息,例如

name
key
id
,因此让我们保留这些信息并让 MongoDB 客户端驱动程序发明
_id

        ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally               
        Map<String,Object> content = mapper.readValue(new File(fileName), Map.class);

        String host = "mongodb://your_connection_uri";
        MongoClient client = MongoClients.create(host);
        MongoDatabase db = client.getDatabase("testX");
        MongoCollection<Document> coll = db.getCollection("foo", Document.class);

        java.util.Map data = (java.util.Map) content.get("data");
      
        data.forEach(
                     (key, value)
                     -> {
                         Document dd = new Document((Map)value);
                         coll.insertOne(dd);
                     });
© www.soinside.com 2019 - 2024. All rights reserved.