1. 程式人生 > >Java 操作yaml和json之間的互相轉換

Java 操作yaml和json之間的互相轉換

需求:
Java 操作,通過標準的json格式,生成yaml檔案,然後再讀取yaml檔案修改裡面的某(多)個變數值(gte,lte,interval,min,max),然後再生成新的json,json格式前後都一樣,就是為了修改裡面的某些變數值,所以用yaml作為中間橋樑

通過yaml生成的json格式:

{
    "size": 0,
    "query": {
        "constant_score": {
            "filter": {
                "range": {
                    "last_updated
": { "gte": 1497283200000, "lte": 1497928996980 } }
}
}
}
, "aggs": { "by_time": { "date_histogram": { "field": "last_updated", "interval": "21526566ms"
, "extended_bounds": { "min": "1497283200000", "max": "1497928996980" } }
, "aggs": { "event_status_group": { "filters": { "filters": { "info
": { "match_phrase": { "alert_status": "info" } }, "warning": { "match_phrase": { "alert_status": "warning" } }, "error": { "match_phrase": { "alert_status": "error" } }, "success": { "match_phrase": { "alert_status": "success" } } }
}
}
}
}
}
}

生成的yaml格式:

size: 0
query:
  constant_score:
    filter:
      range:
        last_updated: {gte: 1497283200000, lte: 1497928996980}
aggs:
  by_time:
    date_histogram:
      field: last_updated
      interval: 21526566ms
      extended_bounds: {min: '1497283200000', max: '1497928996980'}
    aggs:
      event_status_group:
        filters:
          filters:
            info:
              match_phrase: {alert_status: info}
            warning:
              match_phrase: {alert_status: warning}
            error:
              match_phrase: {alert_status: error}
            success:
              match_phrase: {alert_status: success}

在控制檯打印出來的yaml格式是這種,但是寫入到yaml檔案的格式是上面那種(可能是語法問題),但是兩種yaml格式生成的json都是一樣的

size: 0
query:
  constant_score:
    filter:
      range:
        last_updated:
          gte: 1234567899999
          lte: 1111111111111
aggs:
  by_time:
    date_histogram:
      field: "last_updated"
      interval: "21526566ms"
      extended_bounds:
        min: "1497283200000"
        max: "1497928996980"
    aggs:
      event_status_group:
        filters:
          filters:
            info:
              match_phrase:
                alert_status: "info"
            warning:
              match_phrase:
                alert_status: "warning"
            error:
              match_phrase:
                alert_status: "error"
            success:
              match_phrase:
                alert_status: "success"

工具類和main函式

package com.mdl.yaml;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;

import org.yaml.snakeyaml.Yaml;

import com.esotericsoftware.yamlbeans.YamlException;
import com.esotericsoftware.yamlbeans.YamlReader;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
import com.google.gson.Gson;
import com.mdl.yaml.bean.Aggs;
import com.mdl.yaml.bean.Query;

public class TestYaml {

    public static void main(String[] args) {

//      readJsonAndCreateYaml("conf/param.json","conf/patam123.yaml");

//      yamlToJson("conf/file.yaml");

        String result = getJsonParam("conf/file.yaml", 111111, 22222222, "333333", "4444444", "1000");

        System.out.println("\n" + "所有資料修改之後--1" + "\n" + result);

    }


    /**
     * 獲取並設定yaml的值
     * 
     * @param url
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static String getJsonParam(String yaml_url, long lte, long gte, String max, String min, String interval) {
        Map map = returnMapFromYaml(yaml_url);

        Gson gs = new Gson();
        // 設定最後一次更新的起止時間
        String queryStr = gs.toJson((Map) map.get("query"));
        // size的預設為0
        map.put("size", 0);
        Query q = (Query) gs.fromJson(queryStr, Query.class);
        q.getConstant_score().getFilter().getRange().getLast_updated().setLte(lte);
        q.getConstant_score().getFilter().getRange().getLast_updated().setGte(gte);
        ((Map) ((Map) map).get("query")).put("constant_score", q.getConstant_score());

        // 設定bounds的最大最小時間
        String aggstr = gs.toJson((Map) map.get("aggs"));
        Aggs a = (Aggs) gs.fromJson(aggstr, Aggs.class);
        a.getBy_time().getDate_histogram().getExtended_bounds().setMax(max);
        a.getBy_time().getDate_histogram().getExtended_bounds().setMin(min);
        a.getBy_time().getDate_histogram().setInterval(interval);
        ((Map) ((Map) ((Map) map).get("aggs")).get("by_time")).put("date_histogram",
                a.getBy_time().getDate_histogram());

        return gs.toJson(map);
    }

    /**
     * 讀取json並生成yaml
     */
    public static void readJsonAndCreateYaml(String json_url,String yaml_url) {
        try {
            String param = readJson(json_url);
            createYaml(yaml_url,param);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 將json轉化為yaml格式並生成yaml檔案
     * @param jsonString
     * @return
     * @throws JsonProcessingException
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
    public static void createYaml(String yaml_url,String jsonString) throws JsonProcessingException, IOException {
        // parse JSON
        JsonNode jsonNodeTree = new ObjectMapper().readTree(jsonString);
        // save it as YAML
        String jsonAsYaml = new YAMLMapper().writeValueAsString(jsonNodeTree);

        Yaml yaml = new Yaml();
        Map<String,Object> map = (Map<String, Object>) yaml.load(jsonAsYaml);

        createYamlFile(yaml_url, map);
    }

    /**
     * 將資料寫入yaml檔案
     * @param url yaml檔案路徑
     * @param data 需要寫入的資料
     */
    public static void createYamlFile(String url,Map<String, Object> data){
        Yaml yaml = new Yaml();
        FileWriter writer;
        try {
            writer = new FileWriter(url);
            yaml.dump(data, writer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 讀取json檔案並返回字串
     * 
     * @param url
     * @return
     * @throws Exception
     */
    @SuppressWarnings("resource")
    public static String readJson(String url) throws Exception {
        File file = new File(url);
        FileReader fileReader = new FileReader(file);
        BufferedReader bufReader = new BufferedReader(fileReader);
        String message = new String();
        String line = null;
        while ((line = bufReader.readLine()) != null) {
            message += line;
        }
        return message;
    }

    /**
     * 方法一
     * 
     * 讀取yaml生成Map並返回
     * 
     * @param file
     * @return
     */
    @SuppressWarnings("unchecked")
    public static Map<String, Object> yamlToMap(String yaml_url) {
        Map<String, Object> loaded = null;
        try {
            FileInputStream fis = new FileInputStream(yaml_url);
            Yaml yaml = new Yaml();
            loaded = (Map<String, Object>) yaml.load(fis);
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        return loaded;
    }

    /**
     * 方法二
     * 
     * 讀取yaml的內容並轉為map
     * @param url
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static Map returnMapFromYaml(String yaml_url) {
        YamlReader reader;
        Object object = null;
        Map map = null;
        try {
            reader = new YamlReader(new FileReader(yaml_url));
            object = reader.read();
            map = (Map) object;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (YamlException e) {
            e.printStackTrace();
        }
        return map;
    }

    /**
     * 讀取yaml生成json並返回
     * 
     * @param file
     * @return
     */
    @SuppressWarnings("unchecked")
    public static String yamlToJson(String file) {
        Gson gs = new Gson();
        Map<String, Object> loaded = null;
        try {
            FileInputStream fis = new FileInputStream(file);
            Yaml yaml = new Yaml();
            loaded = (Map<String, Object>) yaml.load(fis);
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        }
        return gs.toJson(loaded);
    }



//  /**
//   * demo
//   * 生成yaml格式的string,並寫入yaml檔案
//   */
//  public static void testDumpWriterforyaml() {
//      Map<String, Object> data = new HashMap<String, Object>();
//      data.put("name", "Silenthand Olleander");
//      data.put("race", "Human");
//      data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" });
//
//      Yaml yaml = new Yaml();
//      FileWriter writer;
//      try {
//          writer = new FileWriter("conf/param123.yaml");
//          yaml.dump(data, writer);
//      } catch (IOException e) {
//          e.printStackTrace();
//      }
//  }
//
//  /**
//   * 列印生成yaml格式的string
//   */
//  public static void testDump() {
//      Map<String, Object> data = new HashMap<String, Object>();
//      data.put("name", "Silenthand Olleander");
//      data.put("race", "Human");
//      data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" });
//      Yaml yaml = new Yaml();
//      String output = yaml.dump(data);
//      System.out.println(output);
//  }
//  
//  /**
//   * 列印生成yaml格式的string
//   */
//  public static void printDumpWriter() {
//      Map<String, Object> data = new HashMap<String, Object>();
//      data.put("name", "Silenthand Olleander");
//      data.put("race", "Human");
//      data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" });
//      Yaml yaml = new Yaml();
//      StringWriter writer = new StringWriter();
//      yaml.dump(data, writer);
//      System.out.println(writer.toString());
//  }
}

Aggs.java的實體

package com.mdl.yaml.bean;

public class Aggs {

    private ByTime by_time;

    public ByTime getBy_time() {
        return by_time;
    }

    public void setBy_time(ByTime by_time) {
        this.by_time = by_time;
    }


    public class ByTime{
        private DateHistogram date_histogram;

        public DateHistogram getDate_histogram() {
            return date_histogram;
        }

        public void setDate_histogram(DateHistogram date_histogram) {
            this.date_histogram = date_histogram;
        }

    }


    public class DateHistogram {
        private String field;
        private String interval;
        private ExtendedBounds extended_bounds;

        public String getField() {
            return field;
        }

        public void setField(String field) {
            this.field = field;
        }

        public String getInterval() {
            return interval;
        }

        public void setInterval(String interval) {
            this.interval = interval;
        }

        public ExtendedBounds getExtended_bounds() {
            return extended_bounds;
        }

        public void setExtended_bounds(ExtendedBounds extended_bounds) {
            this.extended_bounds = extended_bounds;
        }

    }

    public class ExtendedBounds{
        private String min;
        private String max;

        public String getMin() {
            return min;
        }
        public void setMin(String min) {
            this.min = min;
        }
        public String getMax() {
            return max;
        }
        public void setMax(String max) {
            this.max = max;
        }
    }


}

Query.java的實體

package com.mdl.yaml.bean;

public class Query {

    private ConstantScore constant_score;

    public ConstantScore getConstant_score() {
        return constant_score;
    }

    public void setConstant_score(ConstantScore constant_score) {
        this.constant_score = constant_score;
    }


    public class ConstantScore{
        private Filter filter;

        public Filter getFilter() {
            return filter;
        }

        public void setFilter(Filter filter) {
            this.filter = filter;
        }
    }

    public class Filter{
        private Range range;

        public Range getRange() {
            return range;
        }

        public void setRange(Range range) {
            this.range = range;
        }
    }

    public class Range{
        private LastUpdated last_updated;

        public LastUpdated getLast_updated() {
            return last_updated;
        }

        public void setLast_updated(LastUpdated last_updated) {
            this.last_updated = last_updated;
        }
    }

    public class LastUpdated{
        private long gte;
        private long lte;
        public long getGte() {
            return gte;
        }
        public void setGte(long gte) {
            this.gte = gte;
        }
        public long getLte() {
            return lte;
        }
        public void setLte(long lte) {
            this.lte = lte;
        }
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>me.ele</groupId>
    <artifactId>elastic.util.giraffe</artifactId>
    <version>1.0.9-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>elastic.util.giraffe</name>

    <properties>
        <!-- Java -->
        <java-version>1.8</java-version>
        <!-- ElasticSearch -->
        <elasticsearch-version>2.3.0</elasticsearch-version>
        <!-- <elasticsearch-version>5.3.1</elasticsearch-version> -->
        <!-- Spring -->
        <spring-framework.version>4.2.1.RELEASE</spring-framework.version>
    </properties>

    <dependencies>
        <dependency>
             <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>${elasticsearch-version}</version>
        </dependency>
        <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-api</artifactId>
           <version>1.7.5</version>
        </dependency>
        <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-simple</artifactId>
           <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>


        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>1.18</version>
        </dependency>

        <dependency>  
            <groupId>com.esotericsoftware.yamlbeans</groupId>  
            <artifactId>yamlbeans</artifactId>  
            <version>1.08</version>  
        </dependency>  


        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
            <version>2.3.0</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.2.3</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>

        <!-- json -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.7</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
            <version>2.9.0.pr4</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <source>${java-version}</source>
                    <target>${java-version}</target>
                    <encoding>UTF-8</encoding>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <compilerArguments>
                        <parameters/>
                    </compilerArguments>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>

        </plugins>
    </build>



    <distributionManagement>
        <repository>
            <id>ele-bpm-release</id>
            <url>http://maven.dev.elenet.me/nexus/content/repositories/ele-bpm-release/</url>
        </repository>
        <snapshotRepository>
            <id>ele-bpm-snapshots</id>
            <url>http://maven.dev.elenet.me/nexus/content/repositories/ele-bpm-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>


</project>