2017-02-17 3 views
-2

Я пытаюсь отформатировать мой json определенным образом, чтобы быть вставленным в базу данных. Я могу развязать json и сопоставить его с структурой просто отлично, но мне нужно иметь возможность добавлять и удалять атрибуты для массива компаний, которые мне нужны. Как я могу получить его для получения конечного результата, указанного в приведенном ниже коде?Unmarshalling JSON в пользовательский формат в Go

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type InterestedParties struct { 
    Companies []Company `json:"companies"` 
    CCID string `json:"eventCCID"` 
} 

type Company struct { 
    CompanyID string `json:"companyID"` 
    CompanyType string `json:"companyType"` 
    WebAPI string `json:"webAPI"` 
} 

type Entitlement struct { 
    Long string 
    Voteable string 
    Tabulation string 
    Confirm string 
} 


func main() { 

    intPartiesJSON := `{"companies": [{"companyID":"COMP0001","companyType":"1","webAPI":"http://google.com"}, {"companyID":"COMP0002","companyType":"1","webAPI":"http://google.com"}],"eventCCID":"laksjlijivelnsvnklsnvlsv"}` 

    var intParties InterestedParties 

    err := json.Unmarshal([]byte(intPartiesJSON), &intParties) 
    if err != nil { 
     fmt.Println("Error while unmarshalling") 
     return 
    } 

    fmt.Println(intParties) 
    b, _ := json.Marshal(intParties) 
    fmt.Println(string(b)) 

    **EDIT:** 
    //This is how I want the marshalled data to look 
    //endResult := `[{"companyID": "COMP001", "entitlements":{"long":"","voteable":"", "tabulation":"","confirm":""}, "effective_date": "2017-01-01"},{"companyID": "COMP002", "entitlements":{"long":"","voteable":"", "tabulation":"","confirm":""}, "effective_date": "2017-01-01"}]` 
+1

Ваш '' intPartiesJSON, кажется, 'entitlements' и' 'Effective_Date поля отсутствует –

+0

Да, это правильно. Он не будет иметь эти поля в запросе. – JMO

ответ

0
b, _ := json.Marshal(map[string]interface{}{ 
    "companyID":  intParties.Companies[0].CompanyID, 
    "entitlements": Entitlement{}, 
    "effective_date": "2017-01-01", 
}) 
+0

Не могли бы вы добавить какой-то контекст к вашему коду? – ppperry

+0

@ppperry См. Последние две строки кода примера вопроса. – dolmen

+0

это близко к тому, что я ищу, но см. Мое редактирование выше для правильного endResult – JMO

0

Вы можете создавать новую структуру и добавить атрибут, как вы хотите для endResult, например:

//endResult := `{"companyID": "COMP001", "entitlements":{"long":"","voteable":"", "tabulation":"","confirm":""}, "effective_date": "2017-01-01"}` 

Конечного результата есть companyID, entitlements и effective_date вашей новая структура будет выглядят следующим образом:

type NewStruct struct { 
    CompanyID  string 
    Entitlements Entitlement 
    EffectiveDate string 
} 

Вы также можете добавить использование []interface{}, если вы хотите, чтобы добавить некоторые динамические атрибуты:

// or you can add new attribute using interface{} 
type NewStruct2 struct { 
    CompanyID  string 
    Entitlements Entitlement 
    EffectiveDate string 
    NewAttribute []interface{} 
} 

и вызвать его с помощью:

entitlement := Entitlement{Long: "check it out", Confirm: "yes"} 
    newStruct := NewStruct{CompanyID: "1234"} 

    endResult := NewStruct2{CompanyID: "222", Entitlements: entitlement} 
    endResult2 := NewStruct2{CompanyID: "222", Entitlements: entitlement} 

    fmt.Printf("result = %+v\n", endResult) 
    fmt.Printf("result = %+v\n", endResult2) 

    // we can add any value or struct to NewAttribute here. 
    endResult.NewAttribute = append(endResult.NewAttribute, newStruct) 
    endResult.NewAttribute = append(endResult.NewAttribute, endResult2) 

    fmt.Printf("endResult = %+v\n", endResult) 
Смежные вопросы