|  | @@ -2,6 +2,7 @@ package bootable
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  |  	"encoding/json"
 | 
	
		
			
				|  |  | +	"strconv"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	"golib/features/mo"
 | 
	
		
			
				|  |  |  	"golib/infra/ii"
 | 
	
	
		
			
				|  | @@ -18,6 +19,7 @@ func objectToStr(row mo.M) string {
 | 
	
		
			
				|  |  |  func handleRow(info *ii.ItemInfo, row mo.M) {
 | 
	
		
			
				|  |  |  	handleTypeDateTime(info, row)
 | 
	
		
			
				|  |  |  	handleTypeFloat(info, row)
 | 
	
		
			
				|  |  | +	handleTypeArray(info, row)
 | 
	
		
			
				|  |  |  	handleFieldLookup(info, row)
 | 
	
		
			
				|  |  |  	handleTypeObject(info, row)
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -63,6 +65,43 @@ func handleTypeObject(info *ii.ItemInfo, row mo.M) {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +func handleTypeArray(info *ii.ItemInfo, row mo.M) {
 | 
	
		
			
				|  |  | +	for _, field := range info.FieldType(mo.TypeArray) {
 | 
	
		
			
				|  |  | +		if field.Items == ii.FieldItemsObject {
 | 
	
		
			
				|  |  | +			oldList, ok := row[field.Name].(mo.A)
 | 
	
		
			
				|  |  | +			if !ok {
 | 
	
		
			
				|  |  | +				continue
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			for i := 0; i < len(oldList); i++ {
 | 
	
		
			
				|  |  | +				oldMap, o := oldList[i].(mo.M)
 | 
	
		
			
				|  |  | +				if !o {
 | 
	
		
			
				|  |  | +					continue
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				m := make(mo.M, len(oldMap))
 | 
	
		
			
				|  |  | +				for k, v := range oldMap {
 | 
	
		
			
				|  |  | +					subField, fo := field.SubField(k)
 | 
	
		
			
				|  |  | +					if !fo {
 | 
	
		
			
				|  |  | +						continue
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +					subFieldName := field.Name + "." + strconv.Itoa(i) + "." + subField.Name
 | 
	
		
			
				|  |  | +					subFieldLabel := subFieldName + "." + ii.FieldLabel
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +					m[subFieldName] = v
 | 
	
		
			
				|  |  | +					row[subFieldName] = v
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +					if subField.Label != "" {
 | 
	
		
			
				|  |  | +						m[subFieldLabel] = subField.Label
 | 
	
		
			
				|  |  | +						row[subFieldLabel] = subField.Label
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				oldList[i] = m
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			row[field.Name] = oldList
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func handleFieldLookup(info *ii.ItemInfo, row mo.M) {
 | 
	
		
			
				|  |  |  	for _, field := range info.Fields {
 | 
	
		
			
				|  |  |  		if !field.HasLookup() {
 |