以前一定要问过这个问题,但我找不到.
我正在使用第三方库来检索JSON格式的数据.图书馆向我提供数据org.json.JSONObject.我想将其映射JSONObject到POJO(Plain Old Java Object)以获得更简单的访问/代码.
对于映射,我目前ObjectMapper以这种方式使用Jackson库:
JSONObject jsonObject = //...
ObjectMapper mapper = new ObjectMapper();
MyPojoClass myPojo = mapper.readValue(jsonObject.toString(), MyPojoClass.class);
Run Code Online (Sandbox Code Playgroud)
据我所知,上面的代码可以得到显着的优化,因为目前JSONObject已经解析过的数据再次被送入序列化 - 反序列化链中,JSONObject.toString()然后进入ObjectMapper.
我想避免这两次转换(toString()和解析).有没有办法使用JSONObject它将数据直接映射到POJO?
我一直在寻找一些用于映射object-object的scala流畅API,类似于AutoMapper.Scala中有这样的工具吗?
我很确定,这是围绕XML到Java Object转换的许多重复问题之一.但我开始这个线程,因为我找不到更简单或寻找更简单的解决方案.
我有一个xsd [我正在设计它]和xml.我想根据映射将xml数据自动映射到Java bean
<tns:SummaryCart xmlns:tns="SummaryCart" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="SummaryCart.xsd">
<SummaryElement type="test">
<order>1</order>
<id>A</id>
<displayName>A</displayName>
<subElements>
<order>1</order>
<id>Preactivation</id>
<displayName>Preactivation</displayName>
</subElements>
<maxlines>1</maxlines>
</SummaryElement>
</tns:SummaryCart>
Run Code Online (Sandbox Code Playgroud)
现在我的Java课程将是
public class SummaryCart{
private List<SummaryElement> summaryElementList;
}
public class SummaryElement {
private int order;
private String id;
private String displayName;
private String property;
private List<SummaryElement> subElements;
private int maxlines;
private String type;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何简单的工具/框架可以将数据从XML自动映射到Java bean [必须支持属性/元素映射].教程会很好.
顺便说一下,我正在使用Spring框架,如果采用spring-oxm优势,欢迎使用它.
我想知道是否有可能在1 go中执行多个sql语句.例如,我想从多个表中删除行的场景,有没有办法可以做的事情,比如...
<delete id="delete" parameterType="String">
DELETE FROM DUMMYTABLE_A where X=${value}
DELETE FROM DUMMYTABLE_B where X=${value}
</delete>
Run Code Online (Sandbox Code Playgroud) 我有像MongoDB一样存储的文档:
const demoArticle = {
created: new Date(),
title: [{
language: 'english',
value: 'This is the english title'
}, {
language: 'dutch',
value: 'Dit is de nederlandse titel'
}]
}
Run Code Online (Sandbox Code Playgroud)
我想将分析器添加到特定语言中,通常指定如下:
"mappings": {
"article": {
"properties": {
"created": {
"type": "date"
},
"title.value": {
"type": "text",
"analyzer": "english"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但问题是:根据子级别上设置的语言,它应该根据相同的语言设置分析器.
我偶然发现了ElasticSearch中的动态模板,但我不太相信它适用于这个用例.
有什么建议?
我想把一组看起来像这样的文件放到一个jar中:
yay/my.jar
boo/my.jar
foo/my.jar
bar/my.jar
Run Code Online (Sandbox Code Playgroud)
在这个过程中,我希望所有这些都重命名如下:
yay_my.jar
boo_my.jar
foo_my.jar
bar_my.jar
Run Code Online (Sandbox Code Playgroud)
我希望使用映射器来实现这一点,但我使用的文件集元素和jar任务似乎并不支持它.
如何在构建jar时应用映射器,或者如何执行这样的转换?我想避免将所有文件复制到我想要的目录结构中并在整个地方制作副本,这就是我们的构建系统现在的工作方式.
我需要一个对象来在我的应用程序中对象映射器.我试过了一些,但是找不到符合我需要的东西,所以我自己写的.目前我有一个如下界面:
public interface IMapper<T, R> {
T Map(R obj);
}
Run Code Online (Sandbox Code Playgroud)
然后我实现了一个AccountMapper,它将Customer映射到一个帐户:
public class AccountMapper : IMapper<Account, Customer> {
Account Map(Customer obj) {
// mapping code
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这工作正常,但我有几个源实体映射到同一目标实体.例如,我有一个付款和一个发票都映射到BillHistory.为了支持这一点,我需要制作两个独立的映射器(即BillHistoryPaymentMapper和BillHistoryInvoiceMapper),这很好.但是,我希望能够像下面那样略微不同地实现它.唯一的问题是我不知道是否可能,如果是,我不知道正确的语法.
public interface IMapper<T> {
T Map<R>(R obj);
}
public class BillHistoryMapper : IMapper<Account> {
public BillHistory Map<Invoice>(Invoice obj) {
// mapping code
}
public BillHistory Map<Payment>(Payment obj) {
// mapping code
}
}
Run Code Online (Sandbox Code Playgroud)
虽然第一个实现工作正常,但第二个实现更优雅.这是可能的,如果是这样,正确的语法是什么样的?
编辑 - - - -
我讨厌人们这样做,但当然我忘了提一个小细节.我们在mapper和接口之间有一个抽象类,用于在所有映射器中实现一些通用逻辑.所以我的映射器签名实际上是:
public class BillHistoryMapper : Mapper<BillHistory, Invoice> {
}
Run Code Online (Sandbox Code Playgroud)
Mapper包含的地方:
public abstract class …Run Code Online (Sandbox Code Playgroud) 我有一个Json格式的字符串,只有没有键或值被引号括起来.例如,我有这个:
String json = "{name: Bob, state: Colorado, Friends: [{ name: Dan, age: 23 }, {name: Zane, age: 24 }]}"
Run Code Online (Sandbox Code Playgroud)
我希望这成为一个看起来像这样的地图:
Map<String, Object> friend1Map = new HashMap<>();
friend1Map.put("name", "Dan");
friend1Map.put("age", 23);
Map<String, Object> friend2Map = new Hashmap<>();
friend2Map.put("name", "Zane");
friend2Map.put("age", 24);
Map<String, Object> newMap = new HashMap<>();
newMap.put("name", "Bob");
newMap.put("state", "Colorado");
newMap.put("Friends", Arrays.asList(friend1Map, friend2Map));
Run Code Online (Sandbox Code Playgroud)
我尝试了以下两种方法:
ObjectMapper mapper = new ObjectMapper();
mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
Run Code Online (Sandbox Code Playgroud)
这将引发错误,说:
Unexpected character ('n'): was expecting double-quote to start field name
Run Code Online (Sandbox Code Playgroud)
然后我尝试更改映射器的配置:
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.readValue(json, …Run Code Online (Sandbox Code Playgroud) 我找不到任何关于 jackson 的 ObjectMapper 与其他映射器(如 dozer/mapStruct/modelMapping/等)之间差异的解释。所有的文章都比较了 dozer/mapStruct/modelMapping 但他们忽略了 ObjectMapper。我不明白有什么问题?是同一个映射器吗?
我的映射器需要发送以下元组:
<custID,prodID,rate>
Run Code Online (Sandbox Code Playgroud)
并且我希望将减少器作为密钥发送到reducer,并将prodID和速率作为值一起发送,因为它们是减少阶段所需的.这是最好的方法吗?
public void map(Object key, Text value, Context context)
throws IOException, InterruptedException {
String[] col = value.toString().split(",");
custID.set(col[0]);
data.set(col[1] + "," + col[2]);
context.write(custID, data);
}
public void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException {
for (Text val : values) {
String[] temp = val.toString().split(",");
Text rate = new Text(temp[1]);
result.set(rate);
context.write(key, result);
}
}
Run Code Online (Sandbox Code Playgroud)