在Java中将InputStream中包含的json diff结果分离到映射中

在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 =

我将一个供应商引入到一个方法中,该方法将基于根据JsonDiff所做的每个更改创建一个对象。供应商的设置如下:

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]]