Удалить объект JSON с нулевым значением в дереве узлов объекта - PullRequest
0 голосов
/ 21 марта 2019

У меня есть файл JSON, из которого мне нужно удалить объекты узлов, которые содержат значение данных null. Можно ли это сделать? Я использую Джексона.

В приведенном ниже примере JSON мне нужно удалить объект, где его тег "v" имеет значение null.

Пример:

{
  "tags" : [ {
    "tagId" : "G1.A_90LT1OUT",
    "data" : [ {
      "ts" : "2019-03-20T15:27:36",
      "v" : "96.2427826",
      "q" : "3"
    } ]
  }, {
    "tagId" : "G1.A_90WN1OUT",
    "data" : [ {
      "ts" : "2019-03-20T15:27:36",
      "v" : null,
      "q" : "0"
    } ]
  }, {
    "tagId" : "G1.A_90LT1OUT",
    "data" : [ {
      "ts" : "2019-03-20T15:29:20",
      "v" : "96.2427826",
      "q" : "3"
    } ]
  }, {
    "tagId" : "G1.A_90WN1OUT",
    "data" : [ {
      "ts" : "2019-03-20T15:29:20",
      "v" : null,
      "q" : "0"
    } ]
  }, {
    "tagId" : "G1.A_90LT1OUT",
    "data" : [ {
      "ts" : "2019-03-20T15:29:37",
      "v" : "96.2581177",
      "q" : "3"
    } ]
  }, {
    "tagId" : "G1.A_90WN1OUT",
    "data" : [ {
      "ts" : "2019-03-20T15:29:37",
      "v" : null,
      "q" : "0"
    } ]
  } ]
}

Мне нужно, чтобы это выглядело так:

    {
      "tags" : [ {
        "tagId" : "G1.A_90LT1OUT",
        "data" : [ {
          "ts" : "2019-03-20T15:27:36",
          "v" : "96.2427826",
          "q" : "3"
        } ]
      }, {
        "tagId" : "G1.A_90LT1OUT",
        "data" : [ {
          "ts" : "2019-03-20T15:29:20",
          "v" : "96.2427826",
          "q" : "3"
        } ]
      }, {
        "tagId" : "G1.A_90LT1OUT",
        "data" : [ {
          "ts" : "2019-03-20T15:29:37",
          "v" : "96.2581177",
          "q" : "3"
        } ]
      } ]
    }

Можно ли это сделать? Пожалуйста, покажи мне, как. Совершенно новый для JSON манипулирования, я видел еще один пост, который показывает, как удалить элемент из узла, но я думаю, что мой случай немного отличается. Я пытался отследить документацию безрезультатно, возможно, искал не в тех местах.

Заранее спасибо.

1 Ответ

2 голосов
/ 22 марта 2019

JSONPath

Для манипуляции и фильтрации JSON вы также можете использовать библиотеку JsonPath. Он имеет отличный веб-инструмент , где вы можете попробовать различные фильтры и опции. Мы можем отфильтровать все узлы с ненулевыми значениями, используя следующий путь:

$.tags[?(@.data[0].v != null)]

Пример приложения, которое делает то же самое:

import com.jayway.jsonpath.JsonPath;
import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;

import java.io.File;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        JSONArray filtered = JsonPath.parse(jsonFile).read("$.tags[?(@.data[0].v != null)]");

        // Create root object
        JSONObject root = new JSONObject();
        root.appendField("tags", filtered);

        // Get JSON
        String json = root.toString();

        // Write JSON on console or file
        System.out.println(json);
    }
}

Над отпечатками кодов:

{"tags":[{"tagId":"G1.A_90LT1OUT","data":[{"ts":"2019-03-20T15:27:36","v":"96.2427826","q":"3"}]},{"tagId":"G1.A_90LT1OUT","data":[{"ts":"2019-03-20T15:29:20","v":"96.2427826","q":"3"}]},{"tagId":"G1.A_90LT1OUT","data":[{"ts":"2019-03-20T15:29:37","v":"96.2581177","q":"3"}]}]}

Jackson

То же самое с Jackson, которого мы можем достичь таким образом:

  • Читать JSON как дерево
  • Перейти к tags массиву
  • Итерация по массиву
  • Для каждого элемента найдите v ключ 0-index элемент
  • В случае, если это null - удалите его

Пример реализации:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File jsonFile = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();
        JsonNode root = mapper.readTree(jsonFile);
        ArrayNode tags = (ArrayNode) root.get("tags");
        Iterator<JsonNode> elements = tags.elements();
        while (elements.hasNext()) {
            JsonNode item = elements.next();
            ArrayNode data = (ArrayNode) item.get("data");
            JsonNode v = data.get(0).get("v");
            if (v.isNull()) {
                elements.remove();
            }
        }

        System.out.println(root);
    }
}
...