Преобразование значений вложенного ключа Json в массив в Java - PullRequest
0 голосов
/ 11 июня 2018

, если мне нужно следовать информации XML-документа в строку:

<Collection>
  ...
  <Places><D>USA</D><D>BRAZIL</D><D>COREA</D></Places>
  ...
</Collection>

и я хочу преобразовать ее в Json, который будет выглядеть примерно так:

{
  "PLACES": ["USA", "BRAZIL", "COREA"]
}

Обратите внимание, что<D> теги игнорируются, и я получаю значения внутри них как значения, которые я хочу в моем массиве ... Как мне сделать это в Java?Я делаю следующее, используя org.json и jackson API:

String xml = FileUtils.readFileToString(new File(file.getAbsolutePath())); 
JSONObject json = org.json.XML.toJSONObject(xml);
ObjectMapper mapper = new ObjectMapper();    
mapper.enable(SerializationFeature.INDENT_OUTPUT)
Object json2 = mapper.readValue(json.toString(), Object.class);
String output = mapper.writeValueAsString(json2);
System.out.println(output);

, но он преобразует информацию следующим образом:

{
 "PLACES" : {
    "D" : [ "USA", "BRAZIL", "COREA" ]
  }

Так что я хочу, чтобы массив был сразу после "МЕСТА ", игнорируя это" Д "... есть предложения?Спасибо

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

SimpleXml и Gson могут сделать это:

public class Collection {
    public Places Places;
}
public class Places {
    @SerializedName("PLACES")
    public List<String> D;
}

final String data = ...
final SimpleXml simple = new SimpleXml();
final Collection c = simple.fromXml(data, Collection.class);

final Gson gson = new Gson();
System.out.println(gson.toJson(c.Places));

Будет выводить:

{"PLACES":["USA","BRAZIL","COREA"]}

Из центра Maven:

<dependency>
    <groupId>com.github.codemonstur</groupId>
    <artifactId>simplexml</artifactId>
    <version>1.4.0</version>
</dependency>

Кстати, если вы этого не сделаетеКак и в случае с именами, вы можете изменить что угодно, используя аннотации SimpleXml.Я не нуждался в них, поэтому я не использовал их.

0 голосов
/ 11 июня 2018

Используйте XmlMapper для преобразования xml в POJO.Даже вам не нужно читать файл вручную.

POJO (Класс сбора)

@JacksonXmlRootElement(localName = "Collection")
public class Collection {

    @JsonProperty("PLACES")
    @JacksonXmlProperty(localName = "D")
    @JacksonXmlElementWrapper(localName = "Places")
    List<String> places;

    public List<String> getPlaces() {
        return places;
    }

    public void setPlaces(List<String> places) {
        this.places = places;
    } 
} 

Основной метод

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

    ObjectMapper xmlMapper = new XmlMapper();
    xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);
    Collection c = xmlMapper.readValue(new File("/root/config.txt"), Collection.class);
    System.out.println(xmlMapper.writeValueAsString(c));

    ObjectMapper jsonMapper = new ObjectMapper();
    jsonMapper.enable(SerializationFeature.INDENT_OUTPUT);
    System.out.println(jsonMapper.writeValueAsString(c));
}

Выход

<Collection>
  <Places>
    <D>USA</D>
    <D>BRAZIL</D>
    <D>COREA</D>
  </Places>
</Collection>

{
  "PLACES" : [ "USA", "BRAZIL", "COREA" ]
}

Библиотека XML

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.5</version>
</dependency>
...