Jackson objectMapping没有获得JSON数据

yan*_*ish 2 java recursion json jackson

我正在使用Jackson objectMapper来解析JSON字符串.我将JSON分配给了一些对象RuleModel,其中

JSON是

"{'ruleId': 1000000,
Formula': {
    'ruleAggregates': 'foo',
    'fields': ['foo', 'foo'],
    'Children':[{ 
        'Formula':
             {'ruleAggregates': 'a',
              'fields': ['1', '2'],
              'Children': []}},
      { 'Formula':
              {'ruleAggregates': 'b',
               'fields': ['3', '4'],
               'Children': []}},
         {}
     ]}}", 
Run Code Online (Sandbox Code Playgroud)

而java模型是

RuleModel{
private long ruleId;
private Formula formula;
}
Run Code Online (Sandbox Code Playgroud)

和Formula是

Formula{
private String ruleAggregates
private List<String> fields;
private List<FormulaModel> Children;
}
Run Code Online (Sandbox Code Playgroud)

我可以获取ruleId值,并且ruleAggregates值为第一个ruleAggregates,但是当我尝试进入Children时,它获取公式而不是里面的值所以当我从子项中获取任何值时我得到空值

Pro*_*uce 6

以下是从原始问题反序列化JSON的示例(在有效性必要时进行了更正).此示例还演示了如何配置Jackson以允许单引号JSON元素.

从最初的问题来看,我不了解尝试反序列化JSON的具体问题.对于简单数据绑定,请注意Java属性名称必须与JSON元素名称匹配,并且Java数据结构必须与JSON数据结构匹配.

input.json

{
    'ruleId': 1000000,
    'Formula': 
    {
        'ruleAggregates': 'foo',
        'fields': ['foo', 'foo'],
        'Children':
        [
            { 
                'Formula':
                {
                    'ruleAggregates': 'a',
                    'fields': ['1', '2'],
                    'Children': []
                }
            },
            {
                'Formula':
                {
                    'ruleAggregates': 'b',
                    'fields': ['3', '4'],
                    'Children': []
                }
            },
            {}
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

Java对象模型

import com.fasterxml.jackson.annotation.JsonProperty;

class RuleModel
{
  private long ruleId;
  @JsonProperty("Formula") private Formula formula;
}

class Formula
{
  private String ruleAggregates;
  private List<String> fields;
  private List<FormulaModel> Children;
}

class FormulaModel
{
  @JsonProperty("Formula") private Formula formula;
}
Run Code Online (Sandbox Code Playgroud)

JacksonFoo.java

import java.io.File;
import java.util.List;

import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonFoo
{
  public static void main(String[] args) throws Exception
  {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
    mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

    RuleModel model = mapper.readValue(new File("input.json"), RuleModel.class);
    System.out.println(mapper.writeValueAsString(model));
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

{
    "ruleId": 1000000,
    "Formula": {
        "ruleAggregates": "foo",
        "fields": [
            "foo",
            "foo"
        ],
        "Children": [
            {
                "Formula": {
                    "ruleAggregates": "a",
                    "fields": [
                        "1",
                        "2"
                    ],
                    "Children": []
                }
            },
            {
                "Formula": {
                    "ruleAggregates": "b",
                    "fields": [
                        "3",
                        "4"
                    ],
                    "Children": []
                }
            },
            {
                "Formula": null
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)