Golang определяет, если пустая строка или null после json decode [duplicate]

неопределенная ссылка на WinMain@16 или аналогичную «необычную» main() ссылку на точку входа (особенно для ).

Вы возможно, пропустили, чтобы выбрать правильный тип проекта с вашей реальной IDE. IDE может захотеть связать, например. Проекты приложений Windows для такой функции точки входа (как указано в недостающей ссылке выше) вместо обычной int main(int argc, char** argv);.

Если ваша среда IDE поддерживает Plain Console Projects , вы может захотеть выбрать этот тип проекта вместо проекта приложения Windows.


Здесь case1 и case2 обрабатываются более подробно из реальный мир проблема.

36
задан Alexander Ponomarev 28 October 2013 в 13:35
поделиться

2 ответа

В пакете encoding/json нет тега, который устанавливает поле «required». Вам придется либо написать свой собственный метод MarshalJSON(), либо выполнить проверку почты для отсутствующих полей.

Чтобы проверить отсутствие пропущенных полей, вам нужно будет использовать указатели, чтобы различать отсутствующие / нулевые и нулевые значения:

type JsonStruct struct {
    String *string
    Number *float64
}

Полный рабочий пример:

package main

import (
    "fmt"
    "encoding/json"
)

type JsonStruct struct {
    String *string
    Number *float64
}

var rawJson = []byte(`{
    "string":"We do not provide a number"
}`)


func main() {
    var s *JsonStruct
    err := json.Unmarshal(rawJson, &s)
    if err != nil {
        panic(err)
    }

    if s.String == nil {
        panic("String is missing or null!")
    }

    if s.Number == nil {
        panic("Number is missing or null!")
    }

    fmt.Printf("String: %s  Number: %f\n", *s.String, *s.Number)
}

Игровая площадка

42
ответ дан ANisus 27 August 2018 в 20:03
поделиться

Вы также можете переопределить unmarshalling для определенного типа (так что требуемое поле, захороненное в нескольких слоях json), без необходимости указывать в поле указатель.

type EnumItem struct {                                                                                            
    Named                                                                                                         
    Value string                                                                                                  
}                                                                                                                 

func (item *EnumItem) UnmarshalJSON(data []byte) (err error) {                                                    
    required := struct {                                                                                          
        Value *string `json:"value"`                                                                              
    }{}                                                                                                           
    all := struct {                                                                                               
        Named                                                                                                     
        Value string `json:"value"`                                                                               
    }{}                                                                                                           
    err = json.Unmarshal(data, &required)                                                                         
    if err != nil {                                                                                               
        return                                                                                                    
    } else if required.Value == nil {                                                                             
        err = fmt.Errorf("Required field for EnumItem missing")                                                   
    } else {                                                                                                      
        err = json.Unmarshal(data, &all)                                                                          
        item.Named = all.Named                                                                                    
        item.Value = all.Value                                                                                    
    }                                                                                                             
    return                                                                                                        
}                                                       
4
ответ дан Ian Walters 27 August 2018 в 20:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: