使用jackson解析Json文件

{ "TestSuite":{ "TestSuiteInfo":{ "-description":"parse" }, "TestCase":[ { "TestCaseData":{ "-sequence":"sequential", "-testNumber":"2", "-testCaseFile":"testcase\\Web\\Ab.xml" } }, { "TestCaseData":{ "-sequence":"sequential", "-testNumber":"3", "-testCaseFile":"testcase\\Web\\BC.xml" } } ] } } 

我的Pojos是:

 public class TestSuite { private TestSuiteInfo testSuiteInfo; private TestCase listOfTestCases; public TestSuiteInfo getTestSuiteInfo() { return testSuiteInfo; } public void setTestSuiteInfo(TestSuiteInfo testSuiteInfo) { this.testSuiteInfo = testSuiteInfo; } public TestCase getListOfTestCases() { return listOfTestCases; } public void setListOfTestCases(TestCase listOfTestCases) { this.listOfTestCases = listOfTestCases; } } public class TestSuiteInfo { private String description; public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } import java.util.Iterator; import java.util.List; public class TestCase { private List testCaseData; public List getTestCaseData() { return testCaseData; } public void setTestCaseData(List testCaseData) { this.testCaseData = testCaseData; } } public class TestCaseData { private String sequence; private int testNumber; private String testCaseFile; public String getSequence() { return sequence; } public void setSequence(String sequence) { this.sequence = sequence; } public int getTestNumber() { return testNumber; } public void setTestNumber(int testNumber) { this.testNumber = testNumber; } public String getTestCaseFile() { return testCaseFile; } public void setTestCaseFile(String testCaseFile) { this.testCaseFile = testCaseFile; } } 

我之前没有使用过jackson,如果有人能帮助我解析文件并获取对象,我将非常感激。 我试图从过去两天解析这个,但没有取得任何成功

通常要使用Jackson库解析JSON,您可以像这样使用ObjectMapper类:

 public static void main(final String[] args) { final String json = "some JSON string"; final ObjectMapper mapper = new ObjectMapper(); final TestSuite readValue = mapper.readValue(json, TestSuite.class); //Then some code that uses the readValue. //Keep in mind that the mapper.readValue() method does throw some exceptions //So you'll need to handle those too. } 

但是,我写了一个快速测试类来检查你的JSON的解析并遇到了一些问题。

基本上,JSON的设计和域的设计不匹配。 因此,您可以更改JSON,也可以更改域对象。

更改JSON以适应域

  1. 其中包含“ – ”的属性名称不会在jackson中很好地解析,因此需要删除它们。
  2. 在每个对象之前拥有类名称将无济于事。 jackson希望这些属性属性,因此类名称将需要删除或替换属性名称。
  3. 必须提供属性名称,因为它们在域对象中,以便jackson解析它们。 你不能只说这是一个对象,然后开始一个列表,列表必须有一个属性名称/

在我调整了JSON中的这些东西后,我让它用提供的域对象进行解析。 我最终得到的JSON看起来像这样:

 { "testSuiteInfo":{ "description":"parse" }, "listOfTestCases":{ "testCaseData":[ { "sequence":"sequential", "testNumber":"2", "testCaseFile":"testcase\\Web\\Ab.xml" }, { "sequence":"sequential", "testNumber":"3", "testCaseFile":"testcase\\Web\\BC.xml" } ] } } 

这是我的测试方法,解析上面的篡改JSON(请忽略所有转义字符)

 public static void main(final String[] args) { final String json = "{\"testSuiteInfo\":{\"description\":\"parse\"}," + "\"listOfTestCases\":{" + "\"testCaseData\":[" + "{\"sequence\":\"sequential\",\"testNumber\":\"2\",\"testCaseFile\":\"testcase\\\\Web\\\\Ab.xml\"}," + "{\"sequence\":\"sequential\",\"testNumber\":\"3\",\"testCaseFile\":\"testcase\\\\Web\\\\BC.xml\"}" + "]" + "}" + "}"; final ObjectMapper mapper = new ObjectMapper(); try { final TestSuite readValue = mapper.readValue(json, TestSuite.class); System.out.println(readValue.getListOfTestCases()); //just a test to see if the object is built } catch (final Exception e) { e.printStackTrace(); } } 

更改域以适合JSON

首先,主要问题是将类名作为属性标识符。 这使得以通常的方式使用此JSON非常困难。 我必须添加几个包装类来绕过JSON中的类名。

  • 我添加了一个OverallWrapper类,它具有TestSuite属性,以满足JSON中的TestSuite类名。

  • 我还添加了一个TestCaseDataWrapper类来满足JSON列表中的TestCaseData类名。

  • 我一起删除了TestCase类,因为它刚刚成为其他类之一的属性。

  • 然后,为了使属性名称与对象匹配,我使用了@JsonProperty注释。

以下是修改后的类,以及工作和解析JSON的终极解析器测试方法。 (再次,请原谅JSON字符串中的所有转义字符)

 import org.codehaus.jackson.annotate.JsonProperty; public class OverallWrapper { private TestSuite testSuite; @JsonProperty("TestSuite") public TestSuite getTestSuite() { return this.testSuite; } public void setTestSuite(final TestSuite testSuite) { this.testSuite = testSuite; } } import java.util.List; import org.codehaus.jackson.annotate.JsonProperty; public class TestSuite { private TestSuiteInfo testSuiteInfo; private List testCaseData; @JsonProperty("TestCase") public List getTestCaseData() { return this.testCaseData; } public void setTestCaseData(final List testCaseData) { this.testCaseData = testCaseData; } @JsonProperty("TestSuiteInfo") public TestSuiteInfo getTestSuiteInfo() { return this.testSuiteInfo; } public void setTestSuiteInfo(final TestSuiteInfo testSuiteInfo) { this.testSuiteInfo = testSuiteInfo; } } import org.codehaus.jackson.annotate.JsonProperty; public class TestSuiteInfo { private String description; @JsonProperty("-description") public String getDescription() { return this.description; } public void setDescription(final String description) { this.description = description; } } import org.codehaus.jackson.annotate.JsonProperty; public class TestCaseDataWrapper { @JsonProperty("TestCaseData") private TestCaseData testcaseData; public TestCaseData getTestcaseData() { return this.testcaseData; } public void setTestcaseData(final TestCaseData testcaseData) { this.testcaseData = testcaseData; } } import org.codehaus.jackson.annotate.JsonProperty; public class TestCaseData { private String sequence; private int testNumber; private String testCaseFile; @JsonProperty("-sequence") public String getSequence() { return this.sequence; } public void setSequence(final String sequence) { this.sequence = sequence; } @JsonProperty("-testNumber") public int getTestNumber() { return this.testNumber; } public void setTestNumber(final int testNumber) { this.testNumber = testNumber; } @JsonProperty("-testCaseFile") public String getTestCaseFile() { return this.testCaseFile; } public void setTestCaseFile(final String testCaseFile) { this.testCaseFile = testCaseFile; } } public static void main(final String[] args) { final String json = "{\"TestSuite\":{\"TestSuiteInfo\":{\"-description\":\"parse\"},\"TestCase\":[" + "{\"TestCaseData\":{\"-sequence\":\"sequential\",\"-testNumber\":\"2\",\"-testCaseFile\":\"testcase\\\\Web\\\\Ab.xml\"}}," + "{\"TestCaseData\":{\"-sequence\":\"sequential\",\"-testNumber\":\"3\",\"-testCaseFile\":\"testcase\\\\Web\\\\BC.xml\"}}" + "]}}"; final ObjectMapper mapper = new ObjectMapper(); try { final OverallWrapper readValue = mapper.readValue(json, OverallWrapper.class); System.out.println(readValue.getTestSuite()); } catch (final Exception e) { e.printStackTrace(); } } 

加起来

最终的问题是该域名不与JSON结合。

就个人而言,我更喜欢将JSON更改为与域名结合,因为域名在设计中似乎有意义,并且需要较少的自定义和强制。

但是,我确实接受您可能没有这个选择,因此重新设计域名。