用JAVA中的空间名解析YAML
亚马尔是 JAVA代码:用JAVA中的空间名解析YAML,java,jackson,yaml,Java,Jackson,Yaml,亚马尔是 JAVA代码: innings: - 1st innings: team: Australia runs:500 - 2nd innings: team: Australia runs:501 导入java.io.File; 导入java.util.List; 导入org.apache.commons.lang3.builder.StringBuilder; 导入org.apache.commons.lang3.builder.
innings:
- 1st innings:
team: Australia
runs:500
- 2nd innings:
team: Australia
runs:501
导入java.io.File;
导入java.util.List;
导入org.apache.commons.lang3.builder.StringBuilder;
导入org.apache.commons.lang3.builder.ToStringStyle;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
/**
*你好,世界!
*
*/
公共类应用程序{
公共静态void main(字符串[]args)引发异常{
ObjectMapper mapper=newObjectMapper(newYamlFactory());
试一试{
Innings user=mapper.readValue(新文件(“a.txt”)、Innings.class);
System.out.println(reflectionStringBuilder.toString(用户,toString样式。多行样式));
}捕获(例外e){
e、 printStackTrace();
}
}
}
班级投球{
公开名单局;
}
班级投球{
公共int运行;
公共弦乐队;
}
错误跟踪:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:未识别的字段“第一局”(班级局),未标记为可忽略(2个已知属性:,“跑步”,“团队”])
在[来源:a.txt;行:3,列:7](通过参考链:局数[“局数]->局数[“第一局数])
注意:如果jackson在这里无法提供帮助,请建议其他解析器。我对
YAMLFactory不太熟悉,但是如果我像这样修改您的POJO:
import java.io.File;
import java.util.List;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
/**
* Hello world!
*
*/
public class App {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
try {
Innings user = mapper.readValue(new File("a.txt"), Innings.class);
System.out.println(ReflectionToStringBuilder.toString(user,ToStringStyle.MULTI_LINE_STYLE));
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Innings {
public List<Inning> innings;
}
class Inning{
public int runs;
public String team;
}
它似乎可以反序列化,但显然这对您来说可能还不够。如果这是JSON,我会用一个数组替换两个in_deep
属性,它会工作得很好。我认为这是YAMLFactory中的一个限制,您可能需要编写一个自定义反序列化程序
打开一个问题可能会得到更多帮助。
请重新考虑类命名以尊重
注意:通常我不会尝试发布不完整的答案,但看起来其他人都不知道如何修复它 使用自定义反序列化程序获取它。谢谢大家
class innings {
public inning[] innings;
}
class inning {
@JsonProperty("1st innings")
public inning_deep first;
@JsonProperty("2nd innings")
public inning_deep second;
}
class inning_deep{
public int runs;
public String team;
}
导入java.io.File;
导入java.io.IOException;
导入java.util.List;
导入org.apache.commons.lang3.builder.StringBuilder;
导入org.apache.commons.lang3.builder.ToStringStyle;
导入com.fasterxml.jackson.core.JsonParser;
导入com.fasterxml.jackson.core.JsonProcessingException;
导入com.fasterxml.jackson.databind.DeserializationContext;
导入com.fasterxml.jackson.databind.JsonNode;
导入com.fasterxml.jackson.databind.ObjectMapper;
导入com.fasterxml.jackson.databind.desr.std.StdDeserializer;
导入com.fasterxml.jackson.databind.module.SimpleModule;
导入com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
公开课{
公共静态void main(字符串[]args){
ObjectMapper mapper=newObjectMapper(newYamlFactory());
SimpleModule=新的SimpleModule();
module.addDeserializer(Inning.class,new InningDeserializer());
映射器注册表模块(模块);
试一试{
Innings user=mapper.readValue(新文件(“a.txt”)、Innings.class);
System.out.println(reflectionStringBuilder.toString(用户,toString样式。多行样式));
}捕获(例外e){
e、 printStackTrace();
}
}
}
班级投球{
公开名单局;
}
班级投球{
公共int运行;
公共弦乐队;
}
类InningDeserializer扩展StdDeserializer{
公共InningDeserializer(){
这个(空);
}
公用局反序列化程序(vc类){
超级(vc);
}
@凌驾
公共局反序列化(JsonParser jp,反序列化上下文ctxt)
抛出IOException、JsonProcessingException{
JsonNode节点=jp.getCodec().readTree(jp);
字符串节点=node.toString();
nodeS=nodeS.substring(nodeS.indexOf(':')+1,nodeS.toString().lastIndexOf('}');
System.out.println(节点);
ObjectMapper mapper=新的ObjectMapper();
返回mapper.readValue(节点,Inning.class);
}
}
请注意,当java开发人员看到您先用小写字母命名类,或者在非私有类中使用公共非最终字段时,他们会感到非常痛苦。是的,我知道,实际上我有一个同名的类“Inning”,为了临时创建这个类,我又创建了一个类“Inning”,非常感谢您的回答。是的,我想要一个没有硬编码的答案。你能推荐其他解析器来解决这个问题吗?即使在Python、Ruby、.NET中也不重要。最好是用JAVA
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
public class InningsParse {
public static void main(String[] args) {
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
SimpleModule module = new SimpleModule();
module.addDeserializer(Inning.class, new InningDeserializer());
mapper.registerModule(module);
try {
Innings user = mapper.readValue(new File("a.txt"), Innings.class);
System.out.println(ReflectionToStringBuilder.toString(user,ToStringStyle.MULTI_LINE_STYLE));
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Innings {
public List<Inning> innings;
}
class Inning{
public int runs;
public String team;
}
class InningDeserializer extends StdDeserializer<Inning> {
public InningDeserializer() {
this(null);
}
public InningDeserializer(Class<?> vc) {
super(vc);
}
@Override
public Inning deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
String nodeS = node.toString();
nodeS = nodeS.substring(nodeS.indexOf(':')+1, nodeS.toString().lastIndexOf('}'));
System.out.println(nodeS);
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(nodeS,Inning.class);
}
}