mirror of
				https://github.com/taigrr/yq
				synced 2025-01-18 04:53:17 -08:00 
			
		
		
		
	Convert to JSON now handles non string keys
This commit is contained in:
		
							parent
							
								
									5b7b390a33
								
							
						
					
					
						commit
						f528b28938
					
				| @ -94,6 +94,28 @@ func TestReadUnwrapJsonByDefaultCmd(t *testing.T) { | |||||||
| 	test.AssertResult(t, "\"frog\"\n", result.Output) | 	test.AssertResult(t, "\"frog\"\n", result.Output) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func TestReadOutputJsonNonStringKeysCmd(t *testing.T) { | ||||||
|  | 
 | ||||||
|  | 	content := ` | ||||||
|  | true: true | ||||||
|  | 5:  | ||||||
|  |   null:  | ||||||
|  |     0.1: deeply | ||||||
|  |     false: things` | ||||||
|  | 	filename := test.WriteTempYamlFile(content) | ||||||
|  | 	defer test.RemoveTempYamlFile(filename) | ||||||
|  | 
 | ||||||
|  | 	cmd := getRootCommand() | ||||||
|  | 	result := test.RunCmd(cmd, fmt.Sprintf("read %s -j", filename)) | ||||||
|  | 
 | ||||||
|  | 	if result.Error != nil { | ||||||
|  | 		t.Error(result.Error) | ||||||
|  | 	} | ||||||
|  | 	expectedOutput := `{"5":{"null":{"0.1":"deeply","false":"things"}},"true":true} | ||||||
|  | ` | ||||||
|  | 	test.AssertResult(t, expectedOutput, result.Output) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func TestReadWithAdvancedFilterCmd(t *testing.T) { | func TestReadWithAdvancedFilterCmd(t *testing.T) { | ||||||
| 	cmd := getRootCommand() | 	cmd := getRootCommand() | ||||||
| 	result := test.RunCmd(cmd, "read ../examples/sample.yaml b.e(name==sam).value") | 	result := test.RunCmd(cmd, "read ../examples/sample.yaml b.e(name==sam).value") | ||||||
|  | |||||||
| @ -58,6 +58,21 @@ type jsonEncoder struct { | |||||||
| 	encoder *json.Encoder | 	encoder *json.Encoder | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func mapKeysToStrings(node *yaml.Node) { | ||||||
|  | 	 | ||||||
|  | 	if node.Kind == yaml.MappingNode { | ||||||
|  | 		for index, child := range node.Content { | ||||||
|  | 			if index % 2 == 0 { // its a map key | ||||||
|  | 				child.Tag = "!!str" | ||||||
|  | 			} | ||||||
|  | 		}	 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for _, child := range node.Content { | ||||||
|  | 		mapKeysToStrings(child) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func NewJsonEncoder(destination io.Writer, prettyPrint bool, indent int) Encoder { | func NewJsonEncoder(destination io.Writer, prettyPrint bool, indent int) Encoder { | ||||||
| 	var encoder = json.NewEncoder(destination) | 	var encoder = json.NewEncoder(destination) | ||||||
| 	var indentString = "" | 	var indentString = "" | ||||||
| @ -73,6 +88,8 @@ func NewJsonEncoder(destination io.Writer, prettyPrint bool, indent int) Encoder | |||||||
| 
 | 
 | ||||||
| func (je *jsonEncoder) Encode(node *yaml.Node) error { | func (je *jsonEncoder) Encode(node *yaml.Node) error { | ||||||
| 	var dataBucket interface{} | 	var dataBucket interface{} | ||||||
|  | 	// firstly, convert all map keys to strings | ||||||
|  | 	mapKeysToStrings(node) | ||||||
| 	errorDecoding := node.Decode(&dataBucket) | 	errorDecoding := node.Decode(&dataBucket) | ||||||
| 	if errorDecoding != nil { | 	if errorDecoding != nil { | ||||||
| 		return errorDecoding | 		return errorDecoding | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user