JSONPATH-阿里和jayway的实现测试
业务业务的需要,所以想找一个从对象中获取属性的工具。
搜了搜发现由阿里和jayway的实现,又花费了一些时间了解和练习,总结了一些要点:
阿里的可能快一些,但考虑到完备性,也许选择jayway更好一些。
本文档参考了以下URL:
Jayway JsonPath介绍_com.jayway.jsonpath-CSDN博客
FASTJSON2 JSONPath支持介绍 | fastjson2
https://github.com/json-path/JsonPath
一、测试代码
1.1基本类TestJsonPath
用于生成测试数据:
package study.base.json; import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import study.base.classes.ChineseMan;
import study.base.classes.Human;
import study.base.classes.Parent; /**
* JsonPath练习
* @author lzfto
*/
public abstract class TestJsonPath { public String toJsonString(Object obj) {
ObjectMapper objectMapper = new ObjectMapper();
String json;
try {
json = objectMapper.writeValueAsString(obj);
return json;
} catch (JsonProcessingException e) {
return "";
} }
public ChineseMan getJObject() {
ChineseMan lzf = new ChineseMan();
lzf.setName("lzf");
lzf.setAge(12);
lzf.setHeight(90);
lzf.setHeight(170);
lzf.set力量("大力");
lzf.set斗志("昂扬");
lzf.setType("传承");
lzf.setSoldier(true);
lzf.setGender("男");
lzf.setBirthDay(new Date());
lzf.setLocation("中国");
Parent father = new Parent("鲁达", "男", 99, new BigDecimal("180"));
Parent mather = new Parent("黄试", "女", 103, new BigDecimal("160"));
lzf.setFather(father);
lzf.setMother(mather); Human girl =new Human("女");
girl.setName("lml");
girl.setHeight(160);
girl.setWeight(90);
girl.setLocation("中国");
girl.setType("创造");
girl.setBirthDay(new Date());
girl.setEatable(false); Human e =new Human("男");
e.setName("lmj");
e.setHeight(175);
e.setWeight(140);
e.setLocation("中国");
e.setType("前瞻");
e.setBirthDay(new Date());
e.setEatable(false);
lzf.getChildren().add(girl);
lzf.getChildren().add(e); return lzf;
} public List<ChineseMan> getObjectList() { final String[] names = { "楼上的", "非法手段", "口袋空空", "嗯嗯开始", "共和国和", "给v叫我", "说的话我", "很多我不怕", "皮肤和", "工期哈" };
Random random = new Random();
List<ChineseMan> list=new ArrayList<>(); for (int i = 1; i <= 10; i++) {
int namePos = random.nextInt(10); // 生成0到9之间的随机数
String name = names[namePos];
int age = random.nextInt(100);
int height = random.nextInt(200);
int weight = random.nextInt(100);
String sex = random.nextInt(0,2) == 1 ? "男" : "女";
ChineseMan jo = this.getRanddomObject(name, age, height, weight, sex);
list.add(jo);
} return list;
} public ChineseMan getRanddomObject(String name, Integer age, Integer height, Integer weight, String sex) {
Random random = new Random();
ChineseMan lzf = new ChineseMan();
lzf.setName(name);
lzf.setAge(age);
lzf.setHeight(height);
lzf.setHeight(weight);
lzf.set力量("大力");
lzf.set斗志("昂扬");
lzf.setType("传承");
lzf.setSoldier(true);
lzf.setGender(sex);
lzf.setBirthDay(new Date());
lzf.setLocation("中国");
Parent father = new Parent(name + "爸", "男", 99, new BigDecimal("180"));
Parent mather = new Parent(name + "妈", "女", 103, new BigDecimal("160"));
lzf.setFather(father);
lzf.setMother(mather); Human girl =new Human("女");
girl.setName(name+"女");
girl.setHeight(random.nextInt(155, 170));
girl.setWeight(random.nextInt(80, 90));
girl.setLocation("中国");
girl.setType("创造");
girl.setBirthDay(new Date());
girl.setEatable(false);
girl.setPower(random.nextInt(100, 400)); Human e =new Human("男");
e.setName(name+"男");
e.setHeight(random.nextInt(155, 170));
e.setWeight(random.nextInt(80, 99));
e.setLocation("中国");
e.setType("前瞻");
e.setBirthDay(new Date());
e.setEatable(false);
e.setPower(random.nextInt(100, 900));
lzf.getChildren().add(girl);
lzf.getChildren().add(e);
return lzf;
} /**
* 从JSON对象中一次获取多个key
*
* @param jo JSON对象
* @param pathList 路径
*/
public abstract void testReadMultiKeyOnce(Object jo, List<String> pathList); /**
* 测试在JSON数组中进行查找,汇总等等 </br>
* </br>
* 不考虑按照数组序号进行查找
*
* @param ja
* @param pathList
*/
public abstract void testReadJsonarray(Object ja, List<String> pathList) ; /**
* 从JSON数组中过读取特定的元素,包含简单的过滤
*
* @param ja
* @param pathList
*/
public abstract void testFilterJsonarray(Object ja, List<String> pathList); }
1.2 阿里实现
package study.base.json.fastjson; import java.util.Arrays;
import java.util.List; import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONPath;
import com.alibaba.fastjson2.JSONWriter; import study.base.classes.ChineseMan;
import study.base.classes.Parent;
import study.base.json.TestJsonPath; /**
* JSONPATH练习
*
* @author lzfto
*/
public class TestFastJsonJSONPath extends TestJsonPath{ /**
* 从JSON对象中一次获取多个key
*
* @param jo JSON对象
* @param pathList 路径
*/
@Override
public void testReadMultiKeyOnce(Object jo, List<String> pathList) {
for (String path : pathList) { try {
Object item = JSONPath.eval(jo, path);
if (item != null) {
if (item instanceof Parent) {
System.out.println(
"key[" + path + "]=" + JSON.toJSONString(item, JSONWriter.Feature.PrettyFormat));
} else {
System.out.println("key[" + path + "]=" + item.toString());
} } else {
System.out.println("key[" + path + "]没有找到对应的值");
}
} catch (Exception e) {
System.out.println("key[" + path + "]没有找到对应的值,因为:"+e.getMessage());
}
} } /**
* 测试在JSON数组中进行查找,汇总等等 </br>
* </br>
* 不考虑按照数组序号进行查找
*
* @param ja
* @param pathList
*/
@Override
public void testReadJsonarray(Object ja, List<String> pathList) {
for (String path : pathList) {
try {
Object item = JSONPath.eval(ja, path);
if (item != null) {
if (item instanceof Parent) {
System.out.println(
"key[" + path + "]=" + JSON.toJSONString(item, JSONWriter.Feature.PrettyFormat));
} else {
System.out.println("key[" + path + "]=" + item.toString());
} } else {
System.out.println("key[" + path + "]没有找到对应的值");
}
} catch (Exception e) {
System.out.println("key[" + path + "]没有找到对应的值,因为:" + e.getMessage());
}
}
} /**
* 从JSON数组中过滤掉特定的元素(满足条件的留下)
*
* @param ja
* @param pathList
*/
@Override
public void testFilterJsonarray(Object ja, List<String> pathList) {
for (String path : pathList) {
try {
Object item = JSONPath.eval(ja, path);
if (item != null) {
System.out.println(
"key[" + path + "]=" + JSONArray.toJSONString(item, JSONWriter.Feature.PrettyFormat)); } else {
System.out.println("条件[" + path + "]没有找到对应的值");
}
} catch (Exception e) {
System.out.println("key[" + path + "]没有找到对应的值,因为:" + e.getMessage());
}
}
} /**
* @param args
*/
/**
* @param args
*/
public static void main(String[] args) {
TestFastJsonJSONPath test = new TestFastJsonJSONPath();
// 1.0 JSONObject中的查找
Object jo = test.getJObject();
List<String> list = Arrays.asList(
// 简单的key查找
"$.name", "$.age", "$.height", "$.力量", "$.father", "$.mother",
// 查找层级大于1的子节点
"$.father.name", "$.mother.name",
"$.children[*]", //所有的孩子
"$.children", //所有的孩子
"$.children[0]", //第一个孩子
"$.children[0].name", //第一个孩子的姓名
// 同时查找多个key/属性,返回的是一个数组,按照顺序的 ["lzf",12,"男"]
"$[\"name\",\"age\",\"gender\"]",
"$[name,age]" // 这个是错误的语法
);
test.testReadMultiKeyOnce(jo, list); // 2.0 JSONArray中的查找
// 2.1 JSON聚集函数 -- 经过测试 fastjson2的JSONPath并不支持max,min等函数
// 主要测试:min,max,avg,sum(),concat,keys(),length()
// 查找成员的成员存在一些问题
// a.无法同时获取多个数组中的多个key
// b.不支持基本的四则运算
// c.不支持特定的函数avg
// e.无法获取数组成员的指定成员,例如如果某个成员是数组,那么无法从这个数组获取指定序号的成员
// 例如不能用 [*].children[0] 来或者 每人的第一个孩子
List<ChineseMan> ja = test.getObjectList();
//System.out.println(JSONArray.toJSONString(ja, Feature.PrettyFormat));
list = Arrays.asList("$[0].name", // 第1个元素的name
"$[*]" // 返回所有的数组元素
, "$[*].age.sum()" // 汇总所有的年龄
, "$[*].age.min()" // 最大年龄
, "$[*].age.max()" // 最小的年龄
, "$[*].age.length()" // 数组个数
, "$[*].length()" // 数组个数
, "$[*]..power" // 所有能量
, "$..power" // 所有能量
//返回数组中数组成员的属性,以下几个居然是等价的,这到底是灵活还是阿里程序员的能力导致的?
, "$[*].children.weight" //返回所有孩子体重,结果是数组*2(因为每人都是2个孩)
, "$[*].children[0].weight" //返回所有第一个孩子体重,结果是数组*1(因为每人都是2个孩)
, "$[*].children[*].weight" //返回所有第一个孩子体重,结果是数组*1(因为每人都是2个孩)
, "$[*].children.weight[0]" //返回所有第一个孩子体重,结果是数组*1(因为每人都是2个孩)
//如何才能够返回所有人第一个孩子的体重信息? , "$[*][\"age\"]" // 所有年龄
, "$[*][\"father\"]" // 所有人员的父亲
, "$[*][\"father\"].name" // 所有人员的父亲的姓名
, "$[*].mother.name" // 所有人员的母亲的姓名
// 以下是错误的语法,或者是不支持的功能
, "$[*].father.length()+$[*].mather.length()" // 所有人员的父母个数,这个语法不合格。不支持四则运算
, "$[*][\"father\",\"mother\"]" // 所有人员的父亲母亲 这个语法非法
, "$[*].age.avg()" // 不支持avg,但可以通过sum/length来解决
);
test.testReadJsonarray(ja, list); // 3.0 JSONArray的过滤测试
// fastjson的过滤相当优先,不能使用组合条件
System.out.println("=========================================================================");
System.out.println("============== 过滤测试 ===================================");
System.out.println("=========================================================================");
list = Arrays.asList("$[*][?(age>90)]" // 返回所有年龄>90的
, "$[*].children[?(weight<100)]" //返回所有孩子体重小于100的孩子信息(非人员信息)
, "$[*].children.weight" //返回所有孩子体重
, "$[*][?(@.children.weight<100)]" //返回所有孩子体重小于100的人员信息(非人员信息)
, "$[*][?(@.children[*].weight<100)]" //返回所有孩子体重小于100的人员信息(非人员信息)
, "$[*][?(@.children.weight<100)]" //返回所有孩子体重小于100的人员信息(非人员信息)
, "$[*][?(age>60sex='女')]" // 返回所有年龄>60的女性个数
);
test.testFilterJsonarray(ja, list);
} }
1.3jayway实现
package study.base.json.jayway; import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.Set; import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.Filter;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Option;
import com.jayway.jsonpath.Predicate;
import com.jayway.jsonpath.ReadContext;
import com.jayway.jsonpath.internal.filter.FilterCompiler;
import com.jayway.jsonpath.spi.json.JacksonJsonProvider;
import com.jayway.jsonpath.spi.json.JsonProvider;
import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
import com.jayway.jsonpath.spi.mapper.MappingProvider; import study.base.classes.ChineseMan;
import study.base.classes.Parent;
import study.base.json.TestJsonPath; /**
* JsonPath练习-基于jayway </br>
* 据说比fastjson的好用
*
* @author lzfto
*/
public class TestJAYWAYJsonPath extends TestJsonPath { /**
* 从JSON数组中过滤掉特定的元素(满足条件的留下)
*
* @param ja
* @param pathList
*/
@Override
public void testFilterJsonarray(Object ja, List<String> pathList) {
Predicate[] pa = new Predicate[0];
ReadContext ctx = JsonPath.parse(ja);
for (String path : pathList) {
try {
Object item = ctx.read(path, pa);
if (item != null) {
System.out.println("key【" + path + "】=" + this.toJsonString(item)); } else {
System.out.println("条件【" + path + "】没有找到对应的值");
}
} catch (Exception e) {
System.out.println("key【" + path + "】没有找到对应的值,因为:" + e.getMessage());
}
}
} public void testFilterJsonarray(DocumentContext doc, List<String> pathList,Predicate filter) {
for (String path : pathList) {
try {
Object item = doc.read(path, filter);
if (item != null) {
System.out.println(
"key【" + path + "】=" + this.toJsonString(item)); } else {
System.out.println("条件【" + path + "】没有找到对应的值");
}
} catch (Exception e) {
System.out.println("key【" + path + "】没有找到对应的值,因为:" + e.getMessage());
}
}
} /**
* 从JSON对象中一次获取多个key
*
* @param jo JSON对象
* @param pathList 路径
*/
@Override
public void testReadMultiKeyOnce(Object jo, List<String> pathList) {
Predicate[] pa = new Predicate[0];
ReadContext ctx = JsonPath.parse(jo);
for (String path : pathList) {
try {
Object item = ctx.read(path, pa);
if (item != null) {
if (item instanceof Parent) {
System.out.println("key[" + path + "]=" + this.toJsonString(item));
} else {
System.out.println("key[" + path + "]=" + item.toString());
} } else {
System.out.println("key[" + path + "]没有找到对应的值");
}
} catch (Exception e) {
System.out.println("key[" + path + "]没有找到对应的值,因为:" + e.getMessage());
}
} } /**
* 测试在JSON数组中进行查找,汇总等等 </br>
* </br>
* 不考虑按照数组序号进行查找
*
* @param ja
* @param pathList
*/
@Override
public void testReadJsonarray(Object ja, List<String> pathList) {
Predicate[] pa = new Predicate[0];
ReadContext ctx = JsonPath.parse(ja);
for (String path : pathList) {
try {
Object item = ctx.read(path, pa);
if (item != null) {
if (item instanceof Parent) {
System.out.println("key[" + path + "]=" + this.toJsonString(item));
} else {
System.out.println("key[" + path + "]=" + item.toString());
} } else {
System.out.println("key[" + path + "]没有找到对应的值");
}
} catch (Exception e) {
System.out.println("key[" + path + "]没有找到对应的值,因为:" + e.getMessage());
}
}
} /**
* @param args
*/
/**
* @param args
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) { Configuration.setDefaults(new Configuration.Defaults() {
private final JsonProvider jsonProvider = new JacksonJsonProvider();
private final MappingProvider mappingProvider = new JacksonMappingProvider(); @Override
public JsonProvider jsonProvider() {
return jsonProvider;
} @Override
public MappingProvider mappingProvider() {
return mappingProvider;
} @Override
public Set<Option> options() {
return EnumSet.noneOf(Option.class);
}
});
TestJAYWAYJsonPath test = new TestJAYWAYJsonPath();
// 1.0 ObjectMapper中的查找
ChineseMan jo = test.getJObject();
System.out.println("=========================================================================");
System.out.println("============== 读取json对象===================================");
System.out.println("=========================================================================");
List<String> list = Arrays.asList(
// 简单的key查找 $ddd.vvvScVSs
"$", "$.name", "$[?(@.gender=='男')]", "$.*",
// 查找层级大于1的子节点
"$.father.name", "$.mother.name", "$.children[*]", // 所有的孩子
"$.children[0]", // 第一个孩子
// 同时查找多个key/属性,返回的是一个数组,按照顺序的 ["lzf",12,"男"]
"$[\"name\",\"age\",\"gender\"]", "$['name','age','gender']");
Map<String, Object> map = Configuration.defaultConfiguration().mappingProvider().map(jo, Map.class,
Configuration.defaultConfiguration());
test.testReadMultiKeyOnce(map, list); // 2.0 JSONArray中的查找
// 2.1 JSON聚集函数 -- 经过测试 fastjson2的JsonPath并不支持max,min等函数
// 主要测试:min,max,avg,sum(),concat,keys(),length()
// 查找成员的成员存在一些问题
// a.如果要访问数组成员的属性,那么不能直接使用.访问,必须使用 [n].prop或者[*].prop,或者使用递归获取..
// chidlren[*].weight和children..weight在某些情况下是等价的
System.out.println("=========================================================================");
System.out.println("============== 读取JSON数组===================================");
System.out.println("=========================================================================");
List<ChineseMan> ja = test.getObjectList();
ja.get(0).getChildren().get(0).setWeight(10);
ja.get(0).getChildren().get(1).setWeight(20);
List<Map<String, Object>> listmap = Configuration.defaultConfiguration().mappingProvider().map(ja, List.class,
Configuration.defaultConfiguration());
list = Arrays.asList("$[0].name", // 第1个元素的name
"$[*]" // 返回所有的数组元素
, "sum($[*].age)" // 汇总所有的年龄
, "min($[*].age)" // 最大年龄
, "max($[*].age)" // 最小的年龄
, "avg($[*].age)" // 平均年龄
, "$.length()" // 数组个数
// 返回数组中数组成员的属性,以下几个居然是等价的,这到底是灵活还是阿里程序员的能力导致的?
, "$[*]..power" // 所有能量
, "$..power" // 返回所有的power--即所谓的深度扫描deepScan
, "$[*].children[0].weight" // 返回所有第一个孩子体重,结果是数组*1(因为每人都是2个孩)
, "$[*].children[*].weight" // 返回所有孩子体重,结果是数组*2(因为每人都是2个孩)
, "$[*].children..weight" // 返回所有孩子体重,结果是数组*2(因为每人都是2个孩)
, "$[*][\"father\",\"mother\"]" // 所有人员的父亲母亲--示范:同时读取数组中的多个元素
, "$[*][\"age\"]" // 所有年龄
, "$[*][\"father\"]" // 所有人员的父亲
, "$[*][\"father\"].name" // 所有人员的父亲的姓名
, "$[*].mother.name" // 所有人员的母亲的姓名
// 以下是错误的语法,或者是不支持的功能
, "$[*].father.length()+$[*].mather.length()" // 可以返回 [4,4] 但不是期望的 ); test.testReadJsonarray(listmap, list); // 3.0 JSONArray的过滤测试
// a.过滤的语法访问属性通常要带上@.
// b.可以对过滤后的数据再次过滤(不过这个过滤是直接的属性访问,不是用?语法)
// c.如果成员也是list,那么无法对检测此类成员的每一个
// fastjson的过滤相当优先,不能使用组合条件
System.out.println("=========================================================================");
System.out.println("============== 过滤测试 ===================================");
System.out.println("=========================================================================");
list = Arrays.asList("$[*].age" // 返回所有年龄>90的
, "$[*][?(@.age>60)].name" // 返回所有年龄>90的姓名
, "$[*][?(@.age>60)]" // 返回所有年龄>90的
, "$[*].children" // 返回所有年龄>90的姓名
, "$[*].children[*].['weight']" // 所有孩子的体重
, "$[*].children[*].weight" // 所有孩子的体重
, "$[*].children[*].['name','weight']" // 所有孩子的名称和体重
, "$[*][?(@.children[*].weight subsetof [10,20])]" // 孩子体重只是10,20的
, "$[*].children[?(@.weight<100)]['name','weight']" // 返回所有孩子体重小于100的孩子信息(非人员信息)
, "$[*][?(@.children[0].weight<100)]['name','weight']" // 返回第一个孩子体重小于100的人员信息(非孩子)
// 以下是错误的语法,或者是不支持的功能
);
test.testFilterJsonarray(listmap, list); //过滤测试 list = Arrays.asList(
// ------------------------------------------------------------------------
"$[*][?]" // 返回所有年龄>60的女性个数
);
DocumentContext doc=JsonPath.parse(listmap);
Filter filter=FilterCompiler.compile("[?(@.age>60)]");
Filter filter2=FilterCompiler.compile("[?(@.gender=='男')]");
Filter filter3=filter2.and(filter); test.testFilterJsonarray(doc, list, filter3); } }
二、小结
a.代码完善性-jayway比阿里好。
ali的开源一贯的大毛病:代码质量不怎么样、文档不怎么样、功能也不怎么样。
jayway实现的功能更加完善一些,例如以下一些是阿里没有的:
, "$[*]..power" // 所有能量
, "$..power" // 所有能量
, "avg($[*].age)" // 平均年龄
"$['name','age','gender']"
总体来说就是jayway的实现会稍微完善一些,友好一些。
b.性能
没有测试过,如果是比较注重效率务必自行测试。如果对效率要求不高的,则推荐jayway
总之jsonpath是一个好东西,在不少的业务场景中具有不少的用处。
JSONPATH-阿里和jayway的实现测试的更多相关文章
- Java JsonPath grab InvalidPathException in code, you must be catching Java 7's java.nio.file.InvalidPathException instead of JsonPath's com.jayway.jsonpath.InvalidPathExceptio
I am using JsonPath and am able to parse my data and get the values when the path provided is correc ...
- (二)基于阿里云的MQTT远程控制(购买阿里云,在云端安装MQTT,测试MQTT远程通信)
QQ名称为Friday~的网友把他自己买MQTT的过程截图发给了我,今天就说一下如何购买阿里云,安装MQTT可以参考 http://www.cnblogs.com/yangfengwu/p/77646 ...
- 阿里毕玄:来测试下你的Java编程能力
上篇整理了下后面准备更系统化写的Java编程进阶的思路,如果仅看里面的词,很多同学会觉得都懂,但我真心觉得没有多少人是真懂的,所以简单的想了一些题目,感兴趣的同学们可以来做做看,看看自己的Java编程 ...
- 更强的 JsonPath 兼容性及性能测试之2022版(Snack3,Fastjson2,jayway.jsonpath)
2022年了,重新做了一份json path的兼容性与性能测试.三个市面上流行框架比较性测试. 免责声明:可能测试得方式不对而造成不科学的结果(另外,机器不同结果会有不同),可以留言指出来.以下测试数 ...
- 就是这么简单!使用Rest-assured 测试Restful Web Services
使用 Rest-assured 测试 Restful Web Services 转载注明出处: http://www.cnblogs.com/wade-xu/p/4298819.html 这里向大家介 ...
- 使用json-path解析json
在我们的日常开发中,有时候需要从一个json字符串中获取一个值,或者从一段json字符串中获取到某些值,如果先使用Gson或Jackson转换成java对象在获取值,有些时候是很麻烦的,那么有没有一种 ...
- 记一次Redis和NetMQ的测试
Redis是一个高速缓存K-V数据库,而NetMQ是ZeroMQ的C#实现版本,两者是完全不同的东西. 最近做游戏服务器的时候想到,如果选择一个组件来做服务器间通信的话,ZeroMQ绝对是一个不错的选 ...
- 使用jsonpath解析json内容
JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容.下面我把官网介绍的每个表达式用代码实现,可以更直观的知道该怎么用它. 一.首先需要 ...
- jsonpath读取json数据格式公用方法!!!
import java.util.LinkedHashMap; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Pred ...
- JsonPath如何获取JSON数据中的值
场景: 发送接口请求后,得到请求结果值是Json数据, 需要从Json数据信息中提取字段值. 响应值字符与字符之间有空格,导致用正则表达式方法提取比较麻烦,于是用java的JsonPath方法提取快速 ...
随机推荐
- 2018-11-14-git无法pull仓库refusing-to-merge-unrelated-histories
title author date CreateTime categories git无法pull仓库refusing to merge unrelated histories lindexi 201 ...
- JavaScript函数属性,方法,ES6拓展内容总结(箭头函数使用,rest参数)
引言 函数在js中也是一个对象,所以它也是有着自己的属性和方法的,了解它们能更好的使用函数. // 各种样子的函数 function foo() {} function foo(a) {} funct ...
- SpringBoot3.1.5对应新版本SpringCloud开发(1)-Eureka注册中心
服务的提供者和消费者 服务之间可以通过Spring提供的RestTemplate来进行http请求去请求另一个Springboot的项目,这就叫做服务间的远程调用. 当一个服务通过远程调用去调用另一个 ...
- 【PG】PostgreSQL12安装
场景:感受一下PostgreSQL12.可以通过如下方式安装: 1.创建psotgres用户 groupadd postgres useradd -g postgres postgres 2.查看操作 ...
- Gparted扩展硬盘空间
需求:有一些磁盘占满了空间,例如/亦或者/opt目录等.可以通过Gparted扩展空间. 1.vmware添加ISO [添加光盘]gparted-live-cd添加至ISO 2.延迟引导启动,强制进入 ...
- go-admin migrate 数据表迁移
目录 视频教程 应用场景 目录说明 数据迁移 迁移步骤 配置数据库 常用命令示例 新建模型实例 3.1 方式一:不编译运行(推荐) 3.2 方式二:编译并运行迁移 3.3 方式三:golangIDE ...
- python教程6.5-excel处理模块
第三方开源模块安装 创建文件 打开已有文件 写数据 选择表 保存表 遍历表 按行遍历 按列遍历 遍历指定行列 遍历指定第几列数据 删除表 设置单元格样式 字体 对齐 设置行高列宽
- leaflet 实现地图上标记的发散闪烁动画
先看效果 js文件:blinkmarker.js L.blinkMarker = function (point, property) { // 使用js标签,便于操作,这个temDivEle的作用是 ...
- 2022年官网下安装Tomcat最全版与官网查阅方法
目录 一.环境整合 构建工具(参考工具部署方式) 二.官网下载 三.解压安装 四.配置环境 五.启动运行 六.配置为服务 七.查看设置服务 一.环境整合 构建工具(参考工具部署方式) 软件名称 版本 ...
- IPv6 — 基于邻居发现协议的通信方式
目录 文章目录 目录 前文列表 IPv6 的通信方式 NDP(Neighbor Discovery Protocol,邻居发现协议) IPv6 地址自动配置 无状态自动配置概述 前文列表 <IP ...