2

私はJacksonobjectMapperを使用して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に移動しようとすると、数式は取得されますが、内部の値は取得されません。したがって、子から値を取得するとnullが発生します。

4

3 に答える 3

6

以下は、元の質問からJSONを逆シリアル化する例です(有効性のために必要に応じて修正されています)。この例は、単一引用符で囲まれたJSON要素を許可するようにJacksonを構成する方法も示しています。

元の質問から、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
            }
        ]
    }
}
于 2012-07-19T05:09:23.943 に答える
0

Childerenは大文字のCで始まり、ジャクソンのデフォルトの動作はキャメルケースです。言い換えれば、jacksonは「childeren」を検索します。このフィールドアノテーションを使用して、プロパティ名を上書きできます。

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

JSONの場合:フィールド名には二重引用符を使用します。フィールド名は小文字で始めます。

Javaの場合:フィールドにgetterメソッドとsetterメソッドを追加します。java.io.Serializableを実装すると役立つ場合があります。

http://jsonlint.com/のようなオンラインのjsonバリデーターツールを使用することもできます

于 2012-07-18T00:20:25.223 に答える