2014-07-16 7 views
0

Ruby에서 복잡한 JSON 구조를 직렬화하려고합니다. 나는 Rails를 사용하지 않지만 Ruby에서 충분히 새로워서 여기서 중요한지 확실하지 않다. 다른 쪽 끝 API는 직렬화하기 전에,이Ruby 직렬화 데이터 구조

{ "command" : { 
    "param" : { "field" : "val", "otherField":"otherVal" }, 
    "param" : { "field" : "val", "otherField":"otherVal" }, 
    "param" : { "field" : "val", "otherField":"otherVal" } 
    } 
} 

루비 객체의 어떤 종류가하는 명령 보류 같은 것을 기대하고있다? 또 다른 레벨의 대괄호가 있기 때문에 배열이 아닙니다 (아래 예 참조). 그리고 나는 루비가 처음이지만 해시에서도 같은 이름을 가진 객체를 둘 이상 가질 수 있다고 생각하지 않습니다.

스토리 :이 같은 해시와 배열 달리 루비 그렇게 잘 JSON으로 직렬화하기 때문에, 내가 기대 한 뭔가 :

Ary = Array.new 
Ary.push (param.new) 
Ary.push (param.new) 
Ary.push (param.new) 
wrappedCmd = { "command" => Ary } 
Oj.dump(wrappedCmd) 

그러나 이것은 생산이 :

{ "command" : [ 
    "param" : { "field" : "val", "otherField":"otherVal" }, 
    "param" : { "field" : "val", "otherField":"otherVal" }, 
    "param" : { "field" : "val", "otherField":"otherVal" } 
    ] 
} 

내가 확인했습니다 그 첫 번째 형식은 수동으로 구성된 직렬화가 진행되는 동안 예상되는 것이고 두 번째 형식은 유효하지 않은 형식 오류를 생성합니다.

+1

* 모든 키가 문자 그대로 "param"이면 * 의미 상으로는 유효하지 않습니다. * JSON은 실제로는 "param"입니다. 키 (예 : JSON 객체 또는 Ruby 해시)에서 키를 복제 할 수 없습니다. 해당 유효하지 않은 JSON이 실제로 "정확함"인지 확인하십시오. (그리고 적절한 JSON 라이브러리는 깨진 마크 업을 표시 할 수 없습니다.) – user2864740

+0

흠. 승인. API 끝을 제어하지 말고 첫 번째 형식을 허용합니다. 감사. – LizH

답변

0

차이점은 첫 번째에는 해시가 포함되고 두 번째에는 해시가 포함된다는 것입니다. 그래서 당신이 대신 같은 것을 수행해야합니다

실제로
cmd = {} 
cmd['param1'] = Param.new 
cmd['param2'] = Param.new 
cmd['param3'] = Param.new 
Oj.dump("command" => cmd) 

, 해시 중복 키 이름을 가질 수 없습니다. 귀하의 API가 적절한 JSON을 사용하지 않는 것 같습니다.

require 'json' 

foo = JSON['{ "command" : { 
    "param" : { "field" : "val", "otherField":"otherVal" }, 
    "param" : { "field" : "val", "otherField":"otherVal" }, 
    "param" : { "field" : "val", "otherField":"otherVal" } 
    } 
}'] 

foo # => {"command"=>{"param"=>{"field"=>"val", "otherField"=>"otherVal"}}} 

그래서, 우리가 유효하지 알고 : 당신이 초기 JSON 문자열을 구문 분석하려고하면

+0

하지만 이렇게 생성되지는 않습니다 : { "command": param1 : stuff, param2 : stuff, param3 : stuff } – LizH

+0

물론 그렇지 않습니다. 적어도 표준 JSON 시리얼 라이저는 아닙니다. –

0

여기 무슨 일입니다. 나는 JSON이 잘못 작성된 예일 뿐이라고 생각한다. "param"을 계속 전송하는 것은 의미가 없기 때문에 다른 매개 변수 이름이어야합니다.

코드와 관련하여 : 관용적 인 루비가 아닙니다.

 
Ary = Array.new 
Ary.push (param.new) 
Ary.push (param.new) 
Ary.push (param.new) 
wrappedCmd = { "command" => Ary } 

우리는 같은 써서 : 더 간단하게

ary = [] 
ary << param.new 
ary << param.new 
ary << param.new 
wrapped_cmd = { "command" => ary } 

또는를 : 심지어

ary = [ 
    param.new, 
    param.new, 
    param.new, 
] 
wrapped_cmd = { "command" => ary } 

또는를 :

wrapped_cmd = { 
    "command" => [ 
     param.new, 
     param.new, 
     param.new, 
    ] 
} 
  • 상수 위스콘신 시작 대문자는 변수가 소문자로 시작하므로 Ary 대신 ary을 사용하십시오.
  • 일반적으로 Array.new이 아닌 빈 배열을 초기화하는 데 []을 사용합니다. 가독성입니다.
  • 일반적으로 배열에 요소를 추가하는 데 <<을 사용합니다. 다시 말하지만, 그것은 가독성입니다.
  • Ruby의 변수는 camelCase가 아닌 snake_case로 작성되어 다시 읽을 수 있습니다. ItItsToReadCamelCase보다 쉽고 빨라졌습니다.
+0

문제의 근본 원인은이 API가 받아 들일 수있는 JSON이 맞지 않다는 것입니다. "param"은 장난감 문제이지만 실제로 같은 필드가 3 번 반복 될 것으로 예상됩니다. 누군가가 오래된 XML 형식을 사용하여 json으로 변환하려고 시도한 것처럼 보입니다.이 경우 stuff 두 번째 모두 정상적이고 합리적인 것입니다. – LizH

+0

OP가 어떤 API에 대해 이야기하고 있는지 전혀 알지 못하기 때문에 우리는 완전히 어둠 속에서 촬영하고 있으며 모든 것은 추측입니다. –

+0

문자열을 예상하는 외부 (Ruby가 아닌) 시스템에 대한 독점적 호출. 문자열은 json 텍스트로 문서화되어 원본 게시물, 복제 된 매개 변수 및 일부 배열 괄호가 누락 된 것처럼 보입니다. 루비를 처음 접했을 때, 나는 이것이 전에 만나지 못한 json 구조라고 생각했다. 어둠 속에서 촬영하지 않고, 질문에 대한 제한적인 대답을 물었다. – LizH