2014-10-17 4 views
1

Я получаю данные JSON от внешнего источника. Имена полей в этом JSON не являются тем, что я хочу носить с собой, поэтому я конвертирую их в имена, которые имеют смысл для меня, используя теги json:"originalname".Игнорировать теги JSON при сортировке

Когда я маршал такой объект обратно в JSON, я, естественно, снова получаю уродливые (оригинальные) имена.

Есть ли способ игнорировать теги при сортировке? Или способ указать другое имя для marshall и unmarshall?

Чтобы уточнить, я подготовил example in the playground и наклеил тот же код ниже.

Заранее спасибо.

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Band struct { 
    Name string `json:"bandname"` 
    Albums int `json:"albumcount"` 
} 

func main() { 
    // JSON -> Object 
    data := []byte(`{"bandname": "AC/DC","albumcount": 10}`) 
    band := &Band{} 
    json.Unmarshal(data, band) 

    // Object -> JSON 
    str, _ := json.Marshal(band) 
    fmt.Println("Actual Result: ", string(str)) 
    fmt.Println("Desired Result:", `{"Name": "AC/DC","Albums": 10}`) 

    // Output: 
    // Actual Result: {"bandname":"AC/DC","albumcount":10} 
    // Desired Result: {"Name": "AC/DC","Albums": 10} 
} 

ответ

4

Вы могли бы реализовать

type Marshaler interface { 
     MarshalJSON() ([]byte, error) 
} 

из encoding/json пакета из стандартной библиотеки. Пример:

type Band struct { 
    Name string `json:"bandname"` 
    Albums int `json:"albumcount"` 
} 

func (b Band) MarshalJSON() ([]byte, error) { 
    n, _ := json.Marshal(b.Name) 
    a, _ := json.Marshal(b.Albums) 
    return []byte(`{"Name":` + string(n) + `,"Albums":` + string(a) + `}`) 
} 

Это, по общему признанию, не очень хорошее решение.

+0

Благодарим за это. Я надеялся, что я пропустил какой-то специальный синтаксис для тегов, чтобы добиться этого с меньшим количеством кода. Что-то вроде 'json:" originalname, MarshalName "' ... – DannyB

+0

Я боюсь, что нет. Это все, что у нас есть. – thwd

Смежные вопросы