2

我正在使用 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 而不是里面的值所以当我从孩子中获取任何值时我会得到空值

4

3 回答 3

6

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

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

输入.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
            }
        ]
    }
}
于 2012-07-19T05:09:23.943 回答
0

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

@JsonProperty("Children")
private List<FormulaModel> Children;
于 2012-07-17T22:08:09.273 回答
0

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

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

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

于 2012-07-18T00:20:25.223 回答