您的位置:首页 > 编程语言 > Java开发

Java 操作yaml和json之间的互相转换

2017-06-28 14:16 453 查看
需求:

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  yaml