2012-07-17 2 views
2

JSON String을 구문 분석하기 위해 Jackson objectMapper를 사용하고 있습니다.JSON 데이터를받지 못하는 Jackson objectMapping

RuleModel{ 
private long ruleId; 
private Formula formula; 
} 

내가

json으로는

"{'ruleId': 1000000, 
Formula': { 
    'ruleAggregates': 'foo', 
    'fields': ['foo', 'foo'], 
    'Children':[{ 
     'Formula': 
      {'ruleAggregates': 'a', 
       'fields': ['1', '2'], 
       'Children': []}}, 
     { 'Formula': 
       {'ruleAggregates': 'b', 
       'fields': ['3', '4'], 
       'Children': []}}, 
     {} 
    ]}}", 

일부 개체 RuleModel, 그리고 자바 모델에 JSON을 할당되며 공식

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

나는를 얻을 수있다 ruleId 값 및 첫 번째 ruleAggregates에 대한 ruleAggregates 값이 있지만 어린이로 들어가려고하면 수식을 얻지 만 안에있는 값이 아님 그래서 아이들의 가치를 얻으 려 할 때 nulls를 얻습니다.

답변

6

같은 온라인 JSON 유효성 검사기 도구를 사용할 수있다 (여기서 유효성에 필요한 수정). 또한이 예제는 싱글 쿼트 JSON 요소를 허용하도록 Jackson을 구성하는 방법을 보여줍니다.

원래 질문에서 JSON을 비 직렬화하려는 시도와 관련된 특정 문제를 이해하지 못합니다. 간단한 데이터 바인딩의 경우, Java 특성 이름이 JSON 요소 이름과 일치해야하며 Java 데이터 구조가 JSON 데이터 구조와 일치해야합니다.

{ 
    'ruleId': 1000000, 
    'Formula': 
    { 
     'ruleAggregates': 'foo', 
     'fields': ['foo', 'foo'], 
     'Children': 
     [ 
      { 
       'Formula': 
       { 
        'ruleAggregates': 'a', 
        'fields': ['1', '2'], 
        'Children': [] 
       } 
      }, 
      { 
       'Formula': 
       { 
        'ruleAggregates': 'b', 
        'fields': ['3', '4'], 
        'Children': [] 
       } 
      }, 
      {} 
     ] 
    } 
} 

자바 객체 모델

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

input.json 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 
      } 
     ] 
    } 
} 
0

jackson의 기본 동작을 낙타로 간주하지 않는다면 Childeren은 대문자 C, jackson으로 시작합니다. 다시 말해서 jackson은 'childeren'을 검색합니다. 이 필드 주석을 사용하여 속성 이름을 덮어 쓸 수 있습니다.

JSON에서
@JsonProperty("Children") 
private List<FormulaModel> Children; 
+0

이 경우 C를 낮추기 위해 어린이가 사용하고 변경 시도는 여전히 대신 'A'와 'B' – yangdafish

+0

HUMH 아주 이상한, 내가 것 낮은 수준의 디버깅 ruleAggregates에 null을 받고, 작동하지 않았다 , 왜 이것이 작동하지 않는지 전혀 알지 못합니다 (주석이 있거나 없음) –

0

: 필드 이름에 대한 사용 따옴표; 필드 이름을 소문자로 시작하십시오.

Java : 필드에 getter 및 setters 메소드를 추가하십시오. java.io.Serializable을 구현하면 도움이 될 수 있습니다.

당신은 또한 다음은 원래의 질문에서 JSON 직렬화 복원의 예입니다 http://jsonlint.com/

관련 문제