在Java中将InputStream中包含的json diff结果分离到映射中
我将一个供应商引入到一个方法中,该方法将基于根据JsonDiff所做的每个更改创建一个对象。供应商的设置如下:在Java中将InputStream中包含的json diff结果分离到映射中,java,json,jackson,inputstream,Java,Json,Jackson,Inputstream,我将一个供应商引入到一个方法中,该方法将基于根据JsonDiff所做的每个更改创建一个对象。供应商的设置如下: ObjectMapper mapper = new ObjectMapper(); // jsons to compare String json1= "{}"; String json2= "{\"name\":\"Sean\", \"state\":\"Colorado\"}"; // convert jsons to JsonNode JsonNode json1Node =
ObjectMapper mapper = new ObjectMapper();
// jsons to compare
String json1= "{}";
String json2= "{\"name\":\"Sean\", \"state\":\"Colorado\"}";
// convert jsons to JsonNode
JsonNode json1Node = mapper.readTree(json1);
JsonNode json2Node = mapper.readTree(json2);
// create Supplier<InputStream>
Supplier<InputStream> diffs = () ->
new ByteArrayInputStream(JsonDiff.asJson(json1Node, json2Node).toString().getBytes());
当我收到该供应商时,我希望能够将每个补丁分割成一个对象。对象只需存储信息,设置如下:
private enum Op {
ADD, REPLACE, REMOVE
}
private Op op;
private String path;
private String value;
public Patch(Op op, String path, String value {
this.op = op;
this.path = path;
this.value = value;
}
// getter methods
从这个特定的示例中,我应该能够创建2个对象,1个用于名称,1个用于状态
我的尝试是这样的:
private List<Patch> patches;
Map<String, String> map = new HashMap<>();
ObjectMapper mapper = new ObjectMapper();
try {
// convert JSON string to Map
map = mapper.readValue(diffs.get().toString(), new TypeReference<HashMap<String, String>>() {});
// create patches
for (String value : map.values()) {
HashMap<String, String> result = mapper.readValue(value, HashMap.class);
patches.add(new Patch(Patch.Op.valueOf(result.get("op").toUpperCase()), result.get("path"), result.get("value")));
}
}catch (IOException e) {
e.printStackTrace();
}
看起来(至少这是我的解释)diff.get().toString()调用没有返回任何与Json非常接近的内容
有人知道怎么做吗?由于jsondiff的结果是一个数组,因此在将其解析为映射而不是列表时可能会遇到问题。 此外,您不必调用供应商输出的toString()方法 下面是一个使用jackson最新版本的工作示例:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.1-1</version>
</dependency>
<dependency>
<groupId>com.github.fge</groupId>
<artifactId>json-patch</artifactId>
<version>1.9</version>
</dependency>
public class Json {
static class Patch {
enum Op {
ADD, REMOVE, REPLACE;
};
private final Op op;
private final String path;
private final String value;
@JsonCreator
public Patch(//
@JsonProperty("op") String op, //
@JsonProperty("path") String path, //
@JsonProperty("value") String value) {
this.op = Op.valueOf(op.toUpperCase());
this.path = path;
this.value = value;
}
@Override
public String toString() {
return "Patch [op=" + op + ", path=" + path + ", value=" + value + "]";
}
}
public static void main(String[] args) throws Exception {
// jsons to compare
String json1 = "{}";
String json2 = "{\"name\":\"Sean\", \"state\":\"Colorado\"}";
// convert jsons to JsonNode
JsonNode json1Node = mapper.readTree(json1);
JsonNode json2Node = mapper.readTree(json2);
// create Supplier<InputStream>
final String strDiff = JsonDiff.asJson(json1Node, json2Node).toString();
Supplier<InputStream> diffs = () -> new ByteArrayInputStream(strDiff.getBytes());
MappingIterator<Patch> iterator = new ObjectMapper()//
.readerFor(Patch.class) //
.readValues(diffs.get());
List<Patch> patches = new ArrayList<>();
while (iterator.hasNext()) {
patches.add(iterator.next());
}
System.out.println(patches);
}
}
由于jsondiff的结果是一个数组,因此在将其解析为映射而不是列表时可能会遇到问题。 此外,您不必调用供应商输出的toString()方法 下面是一个使用jackson最新版本的工作示例:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.1-1</version>
</dependency>
<dependency>
<groupId>com.github.fge</groupId>
<artifactId>json-patch</artifactId>
<version>1.9</version>
</dependency>
public class Json {
static class Patch {
enum Op {
ADD, REMOVE, REPLACE;
};
private final Op op;
private final String path;
private final String value;
@JsonCreator
public Patch(//
@JsonProperty("op") String op, //
@JsonProperty("path") String path, //
@JsonProperty("value") String value) {
this.op = Op.valueOf(op.toUpperCase());
this.path = path;
this.value = value;
}
@Override
public String toString() {
return "Patch [op=" + op + ", path=" + path + ", value=" + value + "]";
}
}
public static void main(String[] args) throws Exception {
// jsons to compare
String json1 = "{}";
String json2 = "{\"name\":\"Sean\", \"state\":\"Colorado\"}";
// convert jsons to JsonNode
JsonNode json1Node = mapper.readTree(json1);
JsonNode json2Node = mapper.readTree(json2);
// create Supplier<InputStream>
final String strDiff = JsonDiff.asJson(json1Node, json2Node).toString();
Supplier<InputStream> diffs = () -> new ByteArrayInputStream(strDiff.getBytes());
MappingIterator<Patch> iterator = new ObjectMapper()//
.readerFor(Patch.class) //
.readValues(diffs.get());
List<Patch> patches = new ArrayList<>();
while (iterator.hasNext()) {
patches.add(iterator.next());
}
System.out.println(patches);
}
}
JsonDiff类是否有toString方法?将diff.get().toString()打印到控制台时会得到什么?它返回:java.io。ByteArrayInputStream@f4d528DoesJsonDiff类有一个toString方法吗?将diff.get().toString()打印到控制台时会得到什么?它返回:java.io。ByteArrayInputStream@f4d528
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.1-1</version>
</dependency>
<dependency>
<groupId>com.github.fge</groupId>
<artifactId>json-patch</artifactId>
<version>1.9</version>
</dependency>
public class Json {
static class Patch {
enum Op {
ADD, REMOVE, REPLACE;
};
private final Op op;
private final String path;
private final String value;
@JsonCreator
public Patch(//
@JsonProperty("op") String op, //
@JsonProperty("path") String path, //
@JsonProperty("value") String value) {
this.op = Op.valueOf(op.toUpperCase());
this.path = path;
this.value = value;
}
@Override
public String toString() {
return "Patch [op=" + op + ", path=" + path + ", value=" + value + "]";
}
}
public static void main(String[] args) throws Exception {
// jsons to compare
String json1 = "{}";
String json2 = "{\"name\":\"Sean\", \"state\":\"Colorado\"}";
// convert jsons to JsonNode
JsonNode json1Node = mapper.readTree(json1);
JsonNode json2Node = mapper.readTree(json2);
// create Supplier<InputStream>
final String strDiff = JsonDiff.asJson(json1Node, json2Node).toString();
Supplier<InputStream> diffs = () -> new ByteArrayInputStream(strDiff.getBytes());
MappingIterator<Patch> iterator = new ObjectMapper()//
.readerFor(Patch.class) //
.readValues(diffs.get());
List<Patch> patches = new ArrayList<>();
while (iterator.hasNext()) {
patches.add(iterator.next());
}
System.out.println(patches);
}
}
[Patch [op=ADD, path=/name, value=Sean], Patch [op=ADD, path=/state, value=Colorado]]