как заменить последний элемент индекса JSON - PullRequest
2 голосов
/ 16 июня 2020

У меня есть JSON в следующем формате. Я хочу заменить Nutrition в последнем индексе на Title, используя код java.

Текущий формат

{
    "nutrients" : [{

        "Nutrient" : "Alcohol, ethyl",
        "Amount" : " 3.9",
        "Unit" : " g"

    }, {

        "Nutrient" : "Fiber",
        "Amount" : " 0.0",
        "Unit" : " g"

    }, {

        "Nutrient" : "Alcoholic beverage, BUDWEISER, regular, beer"

    }] 
}

Требуемый формат

{
    "nutrients" : [{

        "Nutrient" : "Alcohol, ethyl",
        "Amount" : " 3.9",
        "Unit" : " g"

    }, {

        "Nutrient" : "Fiber",
        "Amount" : " 0.0",
        "Unit" : " g"

    }, {

        "Title" : "Alcoholic beverage, BUDWEISER, regular, beer"

    }]
}

Ответы [ 3 ]

1 голос
/ 16 июня 2020

Вы можете добиться этого с помощью Jackson.

Необходимые библиотеки:

  1. Jackson Core: https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core/2.11.0
  2. Jackson Databind: https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind/2.11.0

Но вы не можете изменить имя поля. Вместо этого вы можете добавить новый и удалить другой.

public static void main(String[] args) throws JsonProcessingException {

    String json = ...;

    //transform string to jsonnode
    JsonNode jsonNode = (new ObjectMapper()).readTree(json);

    //get nutrients array node
    JsonNode nutrientsNode = jsonNode.get("nutrients");
    int lastIndex = nutrientsNode.size() - 1;

    //get last node from nutrients and cast to objectnode
    ObjectNode lastNutrientObject = (ObjectNode)nutrientsNode.get(lastIndex);

    //get Nutrient field value from last nutrient
    JsonNode nutrientField = lastNutrientObject.get("Nutrient");

    //remove Nutriend field from last nutrient
    lastNutrientObject.remove("Nutrient");

    //add Title field with node nutrientField into last nutrient
    lastNutrientObject.set("Title", nutrientField);

    System.out.println(jsonNode.toPrettyString());

}
1 голос
/ 16 июня 2020

Это выглядит довольно просто, если вы используете jackson хорошо известную библиотеку java для json. как только у вас есть это в своем пути к классам (может быть, используется зависимость jar или gradle, et c), вы можете сделать это несколькими способами. Самый простой из них - это использовать objectmapper для синтаксического анализа этих данных в pojo, а затем манипулировать этим pojo. или в противном случае вы можете сэкономить дополнительные расходы, и вычисления могут анализировать это в JsonNode.

//try to use this instance as much as you can(JACKSON-101)
ObjectMapper mapper = new ObjectMapper();
    final JsonNode jsonNode = mapper.readTree("parse_your_json_string_here");
    /**
     * to get to the nutrients i use `at` because it is nullsafe :D although if performance is a
     * concern and `/nutrients` is a common use case you may want to precompile the pointer using <code>
     * JsonPointer nutsPointer = JsonPointer.compile("/nutrients");
     * </code>
     */
    final JsonNode temp = jsonNode.at("/nutrients");
    // once done just to be sure we have the right data check that its an arrayNode :D
    if (temp.isArray()) {
      // if true cast it :D
      ArrayNode arrayNode = (ArrayNode) temp;
      final JsonNode nutrientsNodeToModify = arrayNode.path(arrayNode.size() - 1);
      if (nutrientsNodeToModify.isObject()) {
        ObjectNode nutrientsNode = (ObjectNode) nutrientsNodeToModify;
        nutrientsNode.set("Title", nutrientsNode.at("/Nutrient"));
        nutrientsNode.remove("Nutrient");
      }
    }
1 голос
/ 16 июня 2020

Вы можете сделать это, используя String # lastIndexOf и String # substring . Обратите внимание, что у обоих этих методов есть два варианта.

public class Main {
    public static void main(String[] args) {
        String json = "{\n" + "    \"nutrients\" : [{\n" + "\n" + "        \"Nutrient\" : \"Alcohol, ethyl\",\n"
                + "        \"Amount\" : \" 3.9\",\n" + "        \"Unit\" : \" g\"\n" + "\n" + "    }, {\n" + "\n"
                + "        \"Nutrient\" : \"Fiber\",\n" + "        \"Amount\" : \" 0.0\",\n"
                + "        \"Unit\" : \" g\"\n" + "\n" + "    }, {\n" + "\n"
                + "        \"Nutrient\" : \"Alcoholic beverage, BUDWEISER, regular, beer\"\n" + "\n" + "    }] \n"
                + "}";

        int i = json.lastIndexOf("\"Nutrient\"");

        // (string before last "Nutrient") + ("Title") + (string after last "Nutrient")
        String result = json.substring(0, i) + "\"Title\"" + json.substring(i + "\"Nutrient\"".length());

        System.out.println(result);
    }
}

Вывод:

{
    "nutrients" : [{

        "Nutrient" : "Alcohol, ethyl",
        "Amount" : " 3.9",
        "Unit" : " g"

    }, {

        "Nutrient" : "Fiber",
        "Amount" : " 0.0",
        "Unit" : " g"

    }, {

        "Title" : "Alcoholic beverage, BUDWEISER, regular, beer"

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