Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用JAVA中的空间名解析YAML_Java_Jackson_Yaml - Fatal编程技术网

用JAVA中的空间名解析YAML

用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.

亚马尔是

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.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);
    }
}