【问题标题】:Jackson objectMapping not getting JSON dataJackson objectMapping 未获取 JSON 数据
【发布时间】:2012-07-16 21:27:08
【问题描述】:

我正在使用 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': []}},
         {}
     ]}}", 

而java模型是

RuleModel{
private long ruleId;
private Formula formula;
}

公式是

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

我可以获取 ruleId 值和第一个 ruleAggregates 的 ruleAggregates 值,但是当我尝试进入 Children 时,它获取的是 Formulas 而不是里面的值 因此,当我从孩子身上获取任何价值时,我会得到空值

【问题讨论】:

    标签: java json recursion jackson


    【解决方案1】:

    以下是从原始问题反序列化 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': []
                    }
                },
                {}
            ]
        }
    }
    

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

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

    输出:

    {
        "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
                }
            ]
        }
    }
    

    【讨论】:

      【解决方案2】:

      在 JSON 中: 字段名称使用双引号; 以小写开头的字段名称;

      在 Java 中: 为字段添加getter和setter方法; 实现 java.io.Serializable 可能会有所帮助;

      您还可以使用在线 json 验证器工具,例如 http://jsonlint.com/

      【讨论】:

        【解决方案3】:

        Childeren 以大写 C 开头,jackson 如果我没记错的话,jackson 的默认行为是驼峰式。换句话说,杰克逊搜索“childeren”。您可以使用此字段注释覆盖属性名称。

        @JsonProperty("Children")
        private List<FormulaModel> Children;
        

        【讨论】:

        • 尝试使用它并将 Children 更改为小写 c,但不起作用,ruleAggregates 仍然为 null 而不是 'a' 和 'b'
        • 嗯很奇怪,我会进行低级调试,我不知道为什么这不起作用(有或没有注释)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 1970-01-01
        • 1970-01-01
        • 2014-02-11
        • 1970-01-01
        • 2011-12-01
        相关资源
        最近更新 更多