BAEL-2890 (#6905)
This commit is contained in:
committed by
Grzegorz Piwowarek
parent
0c0f148320
commit
d2102a76ff
@@ -0,0 +1,62 @@
|
||||
package com.baeldung.jackson.node;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
|
||||
public class JsonNodeIterator {
|
||||
|
||||
private static final String NEW_LINE = "\n";
|
||||
private static final String FIELD_DELIMITER = ": ";
|
||||
private static final String ARRAY_PREFIX = "- ";
|
||||
private static final String YAML_PREFIX = " ";
|
||||
|
||||
public String toYaml(JsonNode root) {
|
||||
StringBuilder yaml = new StringBuilder();
|
||||
processNode(root, yaml, 0);
|
||||
return yaml.toString();
|
||||
}
|
||||
|
||||
private void processNode(JsonNode jsonNode, StringBuilder yaml, int depth) {
|
||||
if (jsonNode.isValueNode()) {
|
||||
yaml.append(jsonNode.asText());
|
||||
}
|
||||
else if (jsonNode.isArray()) {
|
||||
for (JsonNode arrayItem : jsonNode) {
|
||||
appendNodeToYaml(arrayItem, yaml, depth, true);
|
||||
}
|
||||
}
|
||||
else if (jsonNode.isObject()) {
|
||||
appendNodeToYaml(jsonNode, yaml, depth, false);
|
||||
}
|
||||
}
|
||||
|
||||
private void appendNodeToYaml(JsonNode node, StringBuilder yaml, int depth, boolean isArrayItem) {
|
||||
Iterator<Entry<String, JsonNode>> fields = node.fields();
|
||||
boolean isFirst = true;
|
||||
while (fields.hasNext()) {
|
||||
Entry<String, JsonNode> jsonField = fields.next();
|
||||
addFieldNameToYaml(yaml, jsonField.getKey(), depth, isArrayItem && isFirst);
|
||||
processNode(jsonField.getValue(), yaml, depth+1);
|
||||
isFirst = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void addFieldNameToYaml(StringBuilder yaml, String fieldName, int depth, boolean isFirstInArray) {
|
||||
if (yaml.length()>0) {
|
||||
yaml.append(NEW_LINE);
|
||||
int requiredDepth = (isFirstInArray) ? depth-1 : depth;
|
||||
for(int i = 0; i < requiredDepth; i++) {
|
||||
yaml.append(YAML_PREFIX);
|
||||
}
|
||||
if (isFirstInArray) {
|
||||
yaml.append(ARRAY_PREFIX);
|
||||
}
|
||||
}
|
||||
yaml.append(fieldName);
|
||||
yaml.append(FIELD_DELIMITER);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.baeldung.jackson.node;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
public class ExampleStructure {
|
||||
private static ObjectMapper mapper = new ObjectMapper();
|
||||
|
||||
static JsonNode getExampleRoot() throws IOException {
|
||||
InputStream exampleInput = ExampleStructure.class.getClassLoader()
|
||||
.getResourceAsStream("node_example.json");
|
||||
JsonNode rootNode = mapper.readTree(exampleInput);
|
||||
return rootNode;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package com.baeldung.jackson.node;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
|
||||
public class JsonNodeIteratorUnitTest {
|
||||
|
||||
private JsonNodeIterator onTest = new JsonNodeIterator();
|
||||
private static String expectedYaml = "name: \n" +
|
||||
" first: Tatu\n" +
|
||||
" last: Saloranta\n" +
|
||||
"title: Jackson founder\n" +
|
||||
"company: FasterXML\n" +
|
||||
"pets: \n" +
|
||||
"- type: dog\n" +
|
||||
" number: 1\n" +
|
||||
"- type: fish\n" +
|
||||
" number: 50";
|
||||
|
||||
@Test
|
||||
public void givenANodeTree_whenIteratingSubNodes_thenWeFindExpected() throws IOException {
|
||||
final JsonNode rootNode = ExampleStructure.getExampleRoot();
|
||||
|
||||
String yaml = onTest.toYaml(rootNode);
|
||||
System.out.println(yaml.toString());
|
||||
|
||||
assertEquals(expectedYaml, yaml);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package com.baeldung.jackson.node;
|
||||
|
||||
public class NodeBean {
|
||||
private int id;
|
||||
private String name;
|
||||
|
||||
public NodeBean() {
|
||||
}
|
||||
|
||||
public NodeBean(int id, String name) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
package com.baeldung.jackson.node;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.containsString;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Paths;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
|
||||
public class NodeOperationUnitTest {
|
||||
private static ObjectMapper mapper = new ObjectMapper();
|
||||
|
||||
@Test
|
||||
public void givenAnObject_whenConvertingIntoNode_thenCorrect() {
|
||||
final NodeBean fromValue = new NodeBean(2016, "baeldung.com");
|
||||
|
||||
final JsonNode node = mapper.valueToTree(fromValue);
|
||||
|
||||
assertEquals(2016, node.get("id")
|
||||
.intValue());
|
||||
assertEquals("baeldung.com", node.get("name")
|
||||
.textValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenANode_whenWritingOutAsAJsonString_thenCorrect() throws IOException {
|
||||
final String pathToTestFile = "node_to_json_test.json";
|
||||
final char[] characterBuffer = new char[50];
|
||||
|
||||
final JsonNode node = mapper.createObjectNode();
|
||||
((ObjectNode) node).put("id", 2016);
|
||||
((ObjectNode) node).put("name", "baeldung.com");
|
||||
|
||||
try (FileWriter outputStream = new FileWriter(pathToTestFile)) {
|
||||
mapper.writeValue(outputStream, node);
|
||||
}
|
||||
|
||||
try (FileReader inputStreamForAssertion = new FileReader(pathToTestFile)) {
|
||||
inputStreamForAssertion.read(characterBuffer);
|
||||
}
|
||||
final String textContentOfTestFile = new String(characterBuffer);
|
||||
|
||||
assertThat(textContentOfTestFile, containsString("2016"));
|
||||
assertThat(textContentOfTestFile, containsString("baeldung.com"));
|
||||
|
||||
Files.delete(Paths.get(pathToTestFile));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenANode_whenConvertingIntoAnObject_thenCorrect() throws JsonProcessingException {
|
||||
final JsonNode node = mapper.createObjectNode();
|
||||
((ObjectNode) node).put("id", 2016);
|
||||
((ObjectNode) node).put("name", "baeldung.com");
|
||||
|
||||
final NodeBean toValue = mapper.treeToValue(node, NodeBean.class);
|
||||
|
||||
assertEquals(2016, toValue.getId());
|
||||
assertEquals("baeldung.com", toValue.getName());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenANode_whenAddingIntoATree_thenCorrect() throws IOException {
|
||||
final JsonNode rootNode = ExampleStructure.getExampleRoot();
|
||||
final ObjectNode addedNode = ((ObjectNode) rootNode).putObject("address");
|
||||
addedNode.put("city", "Seattle")
|
||||
.put("state", "Washington")
|
||||
.put("country", "United States");
|
||||
|
||||
assertFalse(rootNode.path("address")
|
||||
.isMissingNode());
|
||||
assertEquals("Seattle", rootNode.path("address")
|
||||
.path("city")
|
||||
.textValue());
|
||||
assertEquals("Washington", rootNode.path("address")
|
||||
.path("state")
|
||||
.textValue());
|
||||
assertEquals("United States", rootNode.path("address")
|
||||
.path("country")
|
||||
.textValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenANode_whenModifyingIt_thenCorrect() throws IOException {
|
||||
final String newString = "{\"nick\": \"cowtowncoder\"}";
|
||||
final JsonNode newNode = mapper.readTree(newString);
|
||||
|
||||
final JsonNode rootNode = ExampleStructure.getExampleRoot();
|
||||
((ObjectNode) rootNode).set("name", newNode);
|
||||
|
||||
assertFalse(rootNode.path("name")
|
||||
.path("nick")
|
||||
.isMissingNode());
|
||||
assertEquals("cowtowncoder", rootNode.path("name")
|
||||
.path("nick")
|
||||
.textValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenANode_whenRemovingFromATree_thenCorrect() throws IOException {
|
||||
final JsonNode rootNode = ExampleStructure.getExampleRoot();
|
||||
((ObjectNode) rootNode).remove("company");
|
||||
|
||||
assertTrue(rootNode.path("company")
|
||||
.isMissingNode());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": {
|
||||
"first": "Tatu",
|
||||
"last": "Saloranta"
|
||||
},
|
||||
"title": "Jackson founder",
|
||||
"company": "FasterXML",
|
||||
"pets": [
|
||||
{
|
||||
"type": "dog",
|
||||
"number": 1
|
||||
},
|
||||
{
|
||||
"type": "fish",
|
||||
"number": 50
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user