Джексон - получить запись внутри массива - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть следующий JSON источник:

{
    "my-systems": [{
            "SYSTEM_A": [{
                    "parameter-name": "a_param1",
                    "parameter-display-name": "parameter 1",
                    "optional": "true"
                },
                {
                    "parameter-name": "a_param2",
                    "parameter-display-name": "Parameter 2",
                    "optional": "false"
                }
            ]
        },
        {
            "SYSTEM_B": [{
                    "parameter-name": "b_param1",
                    "parameter-display-name": "Parameter 1",
                    "optional": "true"
                },
                {
                    "parameter-name": "b_param2",
                    "parameter-display-name": "Parameter 2",
                    "optional": "false"
                }
            ]
        }
    ]
}

Я пытаюсь прочитать его на карте Map<String, SystemParameter[]>.
У меня есть этот код, который я действительно не уверен, если он лучший подход к моей цели.

ArrayNode systemsArr = (ArrayNode)jsonDoc.get("my-systems");
if(systemsArr!= null && !systemsArr.isEmpty()){
    for(JsonNode systemNode : systemsArr ){
        ObjectNode systemObj = (ObjectNode)systemNode;

        System.out.println(systemObj .textValue());
    }
}

Это правильный подход? Как получить имя системы (SYSTEM_A, SYSTEM_B) и преобразовать содержащиеся в ней параметры в массив объектов параметров?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Вам просто нужно использовать jar jackson-databind и json-annotations jar в зависимости, и вы сможете запустить код ниже

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JsonParsing {

    public static void main(String[] args) throws IOException {
        String jsonFilePath = "src/main/resources/source.json"; // JSON File Path
        MySystems mySystems = new ObjectMapper().readValue(new File(jsonFilePath),MySystems.class);

        Map<String,SystemParameter[]> outputMap = new HashMap<>();
        for (Map<String,List<SystemParameter>> map :mySystems.mySystems) {
            for (String key :map.keySet()) {
                outputMap.put(key, map.get(key).toArray(new SystemParameter[0]));
            }
        }
        System.out.println(outputMap);

    }
}

class MySystems {
    @JsonProperty("my-systems")
    List<Map<String,List<SystemParameter>>> mySystems;
}

class SystemParameter {
    @JsonProperty("parameter-name")
    String paramName;

    @JsonProperty("parameter-display-name")
    String paramDispName;

    @JsonProperty("optional")
    String optional;
}
0 голосов
/ 22 апреля 2020

Использование массива «my-systems» бесполезно, если все, что вы делаете, это поддерживаете свои ключи уникальными. (Я предполагаю, что ваша SYSTEM_A может отличаться). Вместо этого я предлагаю вам отформатировать данные JSON следующим образом:

{
  "my-systems": [
    {
      "system-name" : {
        "name":"System_A",
        "parameters": [
          {
            "parameter-name": "a_param1",
            "parameter-display-name": "parameter 1",
            "optional": "true"
          },
          {
            "parameter-name": "a_param2",
            "parameter-display-name": "Parameter 2",
            "optional": "false"
          }
        ]
      }
   }
  ]
}

Этот метод является чистым и позволяет вам перехватить имя системы в свойстве system-name и параметры вложены внутрь. Вы можете просто объявить модель, и Джексон (или gson) просто позаботится обо всем.

Если вы предпочитаете анализировать ответ отдельно или у вас нет контроля над ответом, вы можете выбрать go с вашей реализацией, но вам не нужно конвертировать в ObjectNode. Вы можете использовать приведенные ниже примеры внутри вашего для l oop:

String f2Str = jsonNode.get("f2").asText();
double f2Dbl = jsonNode.get("f2").asDouble();
int    f2Int = jsonNode.get("f2").asInt();
long   f2Lng = jsonNode.get("f2").asLong();

, где 'f2' - ваш ключ, и вы можете получить ключ, используя node.fieldNames (). Next (), что на самом деле получение свойства от итератора.

Вы также можете попробовать те из них, которые ниже, кажется, они лучше обрабатываются.

JsonNode parent = ...;
for (Iterator<String> it = parent.fieldNames() ; it.hasNext() ; ) {
    String field = it.next();
    System.out.println(field + " => " + parent.get(field));
}
for (Iterator<Map.Entry<String,JsonNode>> it = parent.fields() ;
     it.hasNext() ; ) {
    Map.Entry<String,JsonNode> e = it.next();
    System.out.println(e.getKey() + " => " + e.getValue());
}

Последние примеры взяты из здесь . Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...