2

これが私がやろうとしていることです。2つのjson入力があるとしましょう。

初め

{"testArr":[{"name":"name1"},{"name":"name2"}]}

2番

{"testArr":[{"name":"name1Changed"}]}

そして、私はクラスを持っています

class test{
 public String name;
}

class runner{
  public ArrayList<test> testArr;
  public String firstJson;
  public String secondJson;

  public void runProj(){
    ObjectMapper mapper = new ObjectMapper();
    //This one is correct works just fine
    testArr = mapper.readValue(firstJson, ITBTeam.class);

    //Now I want to update just value of first element of array and 
    //tryed to use this function but this one will trim my array
     mapper.readerForUpdating(testArr).readValue(secondJson);
  }

}

だから、この後、私は得ています

{"testArr":[{"name":"name1Changed"}]}

行きたい場所

{"testArr":[{"name":"name1Changed"},{"name":"name2"}]}

ジャクソンから何かが欠けている場合、またはそのような機能がなく、独自に作成する必要がある場合はお知らせください。

ここで私が望んでいたことを行うための直接的な会話はないので、jsonノードが同じことを行うために書いたものです。ノードをマージ/上書きする 2 つの関数と、マージ/上書き配列。これは、2つのjsonノードを渡すことで機能します。誰かが同様のものを探している場合に役立つことを願っています

 public static JsonNode mergeNode(JsonNode mainNode, JsonNode updateNode) {
    Iterator<String> fieldNames = updateNode.fieldNames();
    while (fieldNames.hasNext()) {

        String fieldName = fieldNames.next();
        JsonNode jsonNode = mainNode.get(fieldName);
        // if field exists and is an embedded object
        if (null != jsonNode && (jsonNode.isObject())) {
            mergeNode(jsonNode, updateNode.get(fieldName));
            // if field exists and is an embedded array
        } else if (null != jsonNode && (jsonNode.isArray())) {
            mergeArray(jsonNode, updateNode.get(fieldName));
        } else {
            // Overwrite field node               
            ((ObjectNode) mainNode).set(fieldName, updateNode.get(fieldName));
        }
    }
    return mainNode;
}

public static void mergeArray(JsonNode mainNode, JsonNode updateNode) {
    //Loops over array and adds items if they dont exist 
    //or updates existing value if it is not an object
    for (int i = 0; i < updateNode.size(); i++) {
        JsonNode jsonNode = mainNode.get(i);
        if (null != jsonNode && jsonNode.isObject()) {
            mergeNode(jsonNode, updateNode.get(i));
        } else if (null != jsonNode && (jsonNode.isArray())) {
            mergeArray(jsonNode, updateNode.get(i));
        } else if (null == jsonNode) {
            ((ArrayNode) mainNode).add(updateNode.get(i));
        } else {
            ((ArrayNode) mainNode).set(i, updateNode.get(i));
        }
    }       
}
4

2 に答える 2

1

これで、JSON-Patch https://github.com/fge/json-patchを利用して、2 つの JSON オブジェクト/ノードをマージできます

    // With Jackson
    final JsonMergePatch patch = mapper.readValue(in, JsonMergePatch.class);
    // With a JsonNode
    final JsonMergePatch patch = JsonMergePatch.fromJson(node);

    // orig is also a JsonNode
    final JsonNode patched = patch.apply(orig);
于 2015-07-06T11:44:08.007 に答える
1

あなたの最善の策は、両方のドキュメントをJsonNodes として読み取り、最初のドキュメントをトラバースして、考えているロジックを使用して更新することです。残念ながら、マージしたい方法はたくさんあります。たとえば、JSON 配列の場合、1 つまたは両方を選択する必要があります。またはそれらを連結する必要があります。または、エントリをインデックスでオーバーライドする必要があります (これが必要です)。そのため、Jackson にはそのような処理のための機能がありません。

于 2014-12-31T00:38:17.530 に答える