在java中重新格式化JSON数组/对象



我正在尝试将这个json文件重新格式化为不同的格式。我以前从来没有用过杰克逊或葛兰素史克。我知道它的想法,但我不知道如何实现它。

所以我有一个json文件:file.json,它包含:

{ 
"Fruits": [
{
"name": "avocado",
"organic": true
},
{
"name": "mango",
"organic": true
}
]
}

我想要的是以这种格式获得:

{ 
"List Fruits":{
"Fruits": [
{
"name": "avocado",
"organic": true
},
{
"name": "mango",
"organic": true
}
]
}  
}

不知何故,在json文件中添加了"列出水果"。

我正在尝试使用jackson api,但我不知道如何使用。

将JSON分配给String变量,例如将上述JSON分配给名为json:的变量

String json = "..." // here put your JSON text;

为您的对象准备类:

class Fruit {
private String name;
private boolean organic;
}
class Fruits {
private List<Fruit> fruits;
}

然后使用Gson将JSON转换为您的对象:

Gson gson = new Gson();
Fruits fruits = gson.fromJson(json, Fruits.class);

接下来为fruits对象准备包装类ListOfFruits

class ListOfFruits {
private Fruits listOfFruits;
public ListOfFruits(Fruits fruits) {
listOfFruits = fruits;
}
}

接下来将您的fruits对象打包到另一个:

ListOfFruits lof = new ListOfFruits(fruits);

最后生成返回的输出JSON:

String newJson = gson.toJson(lof);

您不需要创建POJO模型来读取和更新JSON。使用Jackson,您可以将整个JSON有效载荷读取到JsonNode,创建一个具有所需密钥的Map,并串行返回到JSON。参见以下示例:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.io.File;
import java.util.Collections;
import java.util.Map;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
JsonNode root = mapper.readTree(jsonFile);
Map<String, JsonNode> output = Collections.singletonMap("List Fruits", root);
System.out.println(mapper.writeValueAsString(output));
}
}

以上代码打印:

{
"List Fruits" : {
"Fruits" : [ {
"name" : "avocado",
"organic" : true
}, {
"name" : "mango",
"organic" : true
} ]
}
}

我强烈建议您仔细阅读Jackson或Gson库的文档,因为您提到您是新手。我已经为这个项目创建了一个git repo示例。此示例使用Jackson API。

访问https://github.com/rajramo61/jsonwrapper

final InputStream fileData = ClassLoader.getSystemResourceAsStream("file.json");
ObjectMapper mapper = new ObjectMapper();
InitialJson initialJson = mapper.readValue(fileData, InitialJson.class);
System.out.println(mapper.writeValueAsString(initialJson));
final FinalJson finalJson = new FinalJson();
finalJson.setListOfFruits(initialJson);
System.out.println(mapper.writeValueAsString(finalJson));

这是水果课。

public class Fruit {
private String name;
private boolean organic;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean getOrganic() {
return organic;
}
public void setOrganic(boolean organic) {
this.organic = organic;
}
@Override
public String toString() {
return "Fruit{" +
"name='" + name + ''' +
", organic=" + organic +
'}';
}

}

这是FinalJson课程的详细信息。这个类将封装从jsn文件加载的初始json。

public class FinalJson {
private InitialJson listOfFruits;
@JsonProperty("List Fruits")
public InitialJson getListOfFruits() {
return listOfFruits;
}
public void setListOfFruits(InitialJson listOfFruits) {
this.listOfFruits = listOfFruits;
}

}

这是InitialJson类的详细信息。这是一个从json文件中提取数据的类。

public class InitialJson {
private List<Fruit> fruits;
@JsonProperty("Fruits")
public List<Fruit> getFruits() {
return fruits;
}
public void setFruits(List<Fruit> fruits) {
this.fruits = fruits;
}
@Override
public String toString() {
return "InitialJson{" +
"fruits=" + fruits +
'}';
}

}

你可以分叉回购并在本地关闭它,它应该可以正常工作。

最新更新