Генерация JSON из значений карты

Когда вы пишете [x]*3, вы получаете, по существу, список [x, x, x]. То есть список с 3 ссылками на тот же x. Когда вы затем изменяете этот сингл x, он отображается через все три ссылки на него.

Чтобы исправить это, вам нужно убедиться, что вы создаете новый список в каждой позиции. Один из способов сделать это -

[[1]*4 for n in range(3)]

, который будет повторно оценивать [1]*4 каждый раз, а не оценивать его один раз и делать 3 ссылки на 1 список.


Вы можете удивиться почему * не может создавать независимые объекты так, как это делает понимание списка. Это потому, что оператор умножения * работает с объектами, не видя выражений. Когда вы используете * для умножения [[1] * 4] на 3, * видит только 1-элементный список [[1] * 4], а не текст выражения [[1] * 4. * не имеет понятия, как делать копии этого элемента, не знаю, как переоценить [[1] * 4], и не подозревайте, что вы даже хотите копировать, и вообще, возможно, даже не было способа скопировать элемент.

Единственный вариант * - это сделать новые ссылки на существующий подсписчик вместо того, чтобы пытаться создавать новые подсписки. Все остальное было бы непоследовательным или требовало бы значительного пересмотра основополагающих решений по языковому дизайну.

Напротив, понимание списка переоценивает выражение элемента на каждой итерации. [[1] * 4 for n in range(3)] пересчитывает [1] * 4 каждый раз по той же причине [x**2 for x in range(3)] каждый раз переоценивает x**2. Каждая оценка [1] * 4 генерирует новый список, поэтому понимание списка делает то, что вы хотели.

Кстати, [1] * 4 также не копирует элементы [1], но это не имеет значения , так как целые числа неизменны. Вы не можете сделать что-то вроде 1.value = 2 и превратить 1 в 2.

0
задан Vega 24 March 2019 в 07:19
поделиться

2 ответа

См. Код ниже:

package com.abhi.learning.stackoverflow;

import java.util.List;

public class Example {

    private String value;
    private List<String> synonyms = null;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public List<String> getSynonyms() {
        return synonyms;
    }

    public void setSynonyms(List<String> synonyms) {
        this.synonyms = synonyms;
    }

}

Основной класс:

package com.abhi.learning.stackoverflow;

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

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

/**
* Hello world!
*
*/
public class App 
{
    public static void main( String[] args )
    {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enable(SerializationFeature.INDENT_OUTPUT);

        Example emp = new Example();
        ArrayList<String> al = new ArrayList<String>();
        al.add("Critical");
        al.add("Error ");
        al.add("Warning ");

        emp.setSynonyms(al);

        emp.setValue("Severity");


        Example emp1 = new Example();
        ArrayList<String> al1 = new ArrayList<String>();
        al1.add("Inciden");
        al1.add("Risk");
        al1.add("Event");

        emp1.setSynonyms(al1);

        emp1.setValue("Imapct");

        List<Example> lstEx = new ArrayList<Example>();
        lstEx.add(emp1);
        lstEx.add(emp);
        try {
            objectMapper.writeValue(new File("target/employee.json"), lstEx);
        } catch ( IOException e) {
            e.printStackTrace();
        } 
    }
}

Это JSON, который я получил:

    [
{
    "value":"Imapct",
    "synonyms":[
        "Inciden",
        "Risk",
        "Event"
    ]
},
{
    "value":"Severity",
    "synonyms":[
        "Critical",
        "Error ",
        "Warning "
    ]
}
]

Вы можете добавить больше Пример объекты для "событий" & amp; "Примечание"

0
ответ дан user2048204 24 March 2019 в 07:19
поделиться

Вам нужно Pojo следующей спецификации.

class Event {

  private String value;
  private List<String> synonyms;
}

Затем вы составляете список этого класса, и он будет правильно анализировать ваш Json.

List<Event> events = new ArrayList<>();
0
ответ дан Vinay Avasthi 24 March 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: