首页 > 解决方案 > Jackson JSONGenerator 添加换行符、反斜杠等,并且不按格式化顺序显示给定内容

问题描述

在将每个事件从我将Jackson转换List后的 JSON 存储XML到.JSONXML List<>List<String>

完成所有转换后,我必须创建一个带有一些外部元素的新 JSON,然后最后添加从先前存储的转换后的 JSON List<String>。一切正常,但是当我从中添加 JSON 时List<String>,也会添加\n\并且我的所有格式都消失了。我不确定它为什么会这样。

我尝试搜索和使用提到的各种方法,但似乎没有任何效果,所以想在这里发布相同的内容。如果发现重复真的很抱歉。

以下是代码:(请注意:这是我提供的示例直接代码,以便尝试的任何人都可以直接尝试找出问题。但是,下面给出了另一个具有完整工作流程的示例代码。只是为了提供指示我在应用程序中的实际操作。但是,两者都在添加\和删除格式。)

我只是想知道如何避免将这些\和其他不相关的字符添加到我Final JSON并为其添加格式。

public class Main {
    public static void main(String[] args) throws IOException {
        List<String> stringEvents = new ArrayList<>();
        stringEvents.add("{\n" +
                "  isA : \"Customer\",\n" +
                "  name : \"Rise Against\",\n" +
                "  age : \"2000\",\n" +
                "  google:sub : \"MyValue\",\n" +
                "  google:sub : \"MyValue\"\n" +
                "}");

        JsonFactory factory = new JsonFactory();
        StringWriter jsonObjectWriter = new StringWriter();
        JsonGenerator generator = factory.createGenerator(jsonObjectWriter);
        generator.writeStartObject();
        generator.writeStringField("schema", "1.0");
        generator.writeFieldName("eventList");
        generator.writeStartArray();
        stringEvents.forEach(event->{
            try {
                generator.writeObject(event);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        generator.writeEndArray();
        generator.writeEndObject();
        generator.close();
        System.out.println(jsonObjectWriter.toString());
    }
}

以下是我得到的输出:

{"isA":"Customer","name":"Rise Against","age":"2000"}
{"schema":"1.0","eventList":["{\"isA\":\"Customer\",\"name\":\"Rise Against\",\"age\":\"2000\"}","{\"isA\":\"Customer\",\"name\":\"Rise Against\",\"age\":\"2000\"}"]}

以下是我完整的工作流程和代码:

  1. 我正在读取XML文件并将unmarshallingXML 执行到Customer.class.
  2. 我正在执行JSON Conversion转换后的 JSON 并将其存储到List<String>.
  3. 在所有转换之后,我正在Final JSON使用所有标题信息创建我的。

以下是我的Customer.class

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, visible = true, property = "isA")
@JsonInclude(Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@XmlRootElement(name = "extension")
@XmlType(name = "extension", propOrder = {"name", "age"})
@XmlAccessorType(XmlAccessType.FIELD)
@Getter
@Setter
@AllArgsConstructor
@ToString
@NoArgsConstructor
public class Customer {
    @XmlTransient
    private String isA;

    @XmlPath("customer/name/text()")
    private String name;

    @XmlPath("customer/age/text()")
    private String age;
}

以下是我的UnmarshalingJson Creation class

public class Unmarshalling {

    public static void main(String[] args) throws JAXBException, XMLStreamException, FactoryConfigurationError, IOException {
        final InputStream inputStream = Unmarshalling.class.getClassLoader().getResourceAsStream("customer.xml");
        final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
        final Unmarshaller unmarshaller = JAXBContext.newInstance(Customer.class).createUnmarshaller();
        final Customer customer = unmarshaller.unmarshal(xmlStreamReader, Customer.class).getValue();
        final String jsonEvent = new ObjectMapper().writeValueAsString(customer);
        System.out.println(jsonEvent);
        List<String> stringEvents = new ArrayList<>();
        stringEvents.add(jsonEvent);
        stringEvents.add(jsonEvent);

        JsonFactory factory = new JsonFactory();
        StringWriter jsonObjectWriter = new StringWriter();
        JsonGenerator generator = factory.createGenerator(jsonObjectWriter);
        generator.writeStartObject();
        generator.writeStringField("schema", "1.0");
        generator.writeFieldName("eventList");
        generator.writeStartArray();
        stringEvents.forEach(event->{
            try {
                generator.writeObject(event);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        generator.writeEndArray();
        generator.writeEndObject();
        generator.close();
        System.out.println(jsonObjectWriter.toString());

    }
}

以下是我的xml文件:

<extension xmlns:google="https://google.com">
    <customer>
        <name>Rise Against</name>
        <age>2000</age>
    </customer>
</extension>

标签: javajsonjacksonjackson2

解决方案


在尝试了更多的事情之后,我尝试generator.writeRaw(event);了并且奏效了。

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;

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

public class Main {
    public static void main(String[] args) throws IOException {
        List<String> stringEvents = new ArrayList<>();
        stringEvents.add("{\n" +
                "  isA : \"Customer\",\n" +
                "  name : \"Rise Against\",\n" +
                "  age : \"2000\",\n" +
                "  google:sub : \"MyValue\",\n" +
                "  google:sub : \"MyValue\"\n" +
                "}");

        JsonFactory factory = new JsonFactory();
        StringWriter jsonObjectWriter = new StringWriter();
        JsonGenerator generator = factory.createGenerator(jsonObjectWriter);
        generator.writeStartObject();
        generator.writeStringField("schema", "1.0");
        generator.writeFieldName("eventList");
        generator.writeStartArray();
        stringEvents.forEach(event->{
            try {
                generator.writeRaw(event);
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        generator.writeEndArray();
        generator.writeEndObject();
        generator.close();
        System.out.println(jsonObjectWriter.toString());
    }
}

推荐阅读