java - JSON数组的反序列化

标签 java json jackson deserialization

我不确定如何反序列化包含纯字符串的数组。我正在尝试解析以下 JSON

 {  
   "state":"RT",
   "testMethod":"electronic", 
   "testElements":[  
      {  
         "testId":[  
            "UT_ITXref",
            "Fed_ITXref"
         ]
      },
      "testStartDate",
      "testEndDate",
      "testDueDate"
   ]
}

我收到以下错误:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.test.rules.model.TestElements: no String-argument constructor/factory method to deserialize from String value ('testStartDate')
 at [Source: {"state":"RT","testMethod":"electronic","testElements":[{"testId":["UT_ITXref","Fed_ITXref"]},"testStartDate","testEndDate","testDueDate"}]}; line: 1, column: 247] (through reference chain: com.test.rules.model.TestRules["testElements"]->java.lang.Object[][1])
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
    at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456)
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1012)
    at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:370)
    at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:315)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1282)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:159)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:150)
    at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:196)
    at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:20)
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:499)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:511)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:396)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1198)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:314)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:148)
    at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:1626)
    at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1220)

这是我所做的,我使用@JsonCreator注释来反序列化

public class TestRules {

    private String state;   
    private String testMethod;  
    private TestElements[] testElements;    

     @JsonCreator
        public TaxRules(
          @JsonProperty("state") String  state,     
          @JsonProperty("testMethod") String testMethod,          
          @JsonProperty("testElements") TestElements[] testElements
          ) {
            this.state = state;         
            this.testMethod = testMethod;          
            this.testElements = testElements;          
        }   

}

 public class TestElements {
    private List<String> testId;
    private List<String> elements;  

    public List<String> getElements() {
            return elements;
        }
        public void setElements(List<String> elements) {
            this.elements = elements;
        }
        public List<String> getTestId() {
            return testId;
        }
        public void setTestId(List<String> testId) {
            this.testId = testId;
        }   

}

我应该编写自定义反序列化器吗?或者有什么方法可以使用 jackson API 来实现此目的。如有任何建议,我们将不胜感激。

最佳答案

实际上错误说明了一些事情。

JSON 解析器发现 testElements 属性有一个对象数组,但您的 Json 文件包含混合内容。

第一个元素是一个对象(我假设它是 TestElement 类)。然后解析器使用空构造函数创建该对象,并为其属性调用适当的 setter 。 但是...

第二个、第三个和第四个元素是字符串,因此错误表明解析器尝试以字符串作为参数查找收缩器。

因此,您可以尝试在 TestElement 类中创建该构造函数,看看它是否有效... 不要忘记保留空构造函数。

我不能保证它会起作用,但至少错误表明了这一点。

顺便说一句,你确定你的 Json 对象是正确的吗?但不是那样的东西?

{  
 "state":"RT",
 "testMethod":"electronic", 
 "testElements":[  
  {  
     "testId":[  
        "UT_ITXref",
        "Fed_ITXref"
     ]
  }],
  "testStartDate":"01-01-2017",
  "testEndDate":"01-02-2017",
  "testDueDate":"01-03-2017"
}

我有点困惑,因为 StartDate、EndDate、DueDate 在语义上看起来更像是测试属性,而不是 testElements 数组中的元素

关于java - JSON数组的反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42379113/

相关文章:

java - 如何将属性文件中的数据加载到bean属性值中?

php - swift 3 json 不工作

javascript - grunt-spritesmith 配置在 gruntfile.js 上无法正常工作

json - 从 Swift 中的 API 响应中提取可用数据

java - Jackson:从 JSON 数组中获取没有 id 的单个值

java - 有没有一种方法,例如使用 @JsonFilter 来仅打印 HashMap 的值?

java - 使用socket编程将文件从android传输到pc

java - 如何在java中创建mysql数据库的备份

java - Spring Security 注释禁用登录表单功能

java - jackson xml 模块 : deserializing immutable type with a @JacksonXmlText property