2017-02-21 16 views
0

У меня есть JSON-файл, который выглядит следующим образом:карта [строка] структура внутри структуры

{ 
    "jailbreaks": [ 
    { 
     "jailbroken": false, 
     "name": "", 
     "version": "", 
     "url": "", 
     "anleitung": [], 
     "ios": { 
     "start": "10.2.1" 
     }, 
     "caveats": "", 
     "platforms": [] 
    }, 
    { 
     "jailbroken": true, 
     "name": "Yalu102", 
     "version": "beta 6", 
     "url": "https://domain-dl.tld", 
     "anleitung": [ 
     { "blog": "title", "link": "http://domain.tld/" }, 
     { "blog": "Test", "link": "http://google.at" } 
     ], 
     "ios": { 
     "start": "10.2" 
     }, 
     "caveats": "some text here", 
     "platforms": [ 
     "Windows", 
     "OS X", 
     "Linux" 
     ] 
    }, 

И я создаю объект для работы с так:

type Jailbreak struct { 
    Jailbroken bool `json:"jailbroken"` 
    Name  string `json:"name"` 
    Version string `json:"version"` 
    URL  string `json:"url"` 
    Anleitung map[string]struct { 
     Name string `json:"blog"` 
     Link string `json:"link"` 
    } `json:"anleitung"` 

    Firmwares struct { 
     Start string `json:"start"` 
     End string `json:"end"` 
    } `json:"ios"` 

    Platforms []string `json:"platforms"` 
    Caveats string `json:"caveats"` 
} 

Когда я хочу построить моя программа go Я получаю сообщение об ошибке, что JSON-файл не может быть прочитан. Но как только я удалю map[string]struct, я могу скомпилировать и запустить программу без ошибок, и все работает нормально. Я что-то бормочу с чем-то или есть ошибка в моем файле JSON?

+2

В json '' anleitung "' массив, вы не можете его развязать на карте. – JimB

+1

свойство anleitung в JSON - это массив, а не объект. Он несовместим с немаршалом. – PieOhPah

ответ

-1

Используйте флаг omitempty, когда ваш «anleitung» пуст в JSON, чтобы его уничтожить. Остерегайтесь, хотя, когда это так, ваша структура Jailbreak не будет иметь поле «anleitung».

Изменить флагов json для вашей карты;

Anleitung map[string]struct { 
    Name string `json:"blog"` 
    Link string `json:"link"` 
} `json:"anleitung,omitempty"` 

Вариант 2;

Я думаю, вы также можете использовать Anleitung map[string]interface{}, но это лучше для «хранения карты строк для произвольных типов данных». В вашем случае данные не произвольны, а скорее пустые, я думаю. И похоже, что это просто временно.

Я бы выбрал вариант 1, тогда я бы проверял, содержит ли моя структура какие-либо данные Anleitung или нет, прежде чем обращаться к ней.

1

JSON при условии, не действует (как массив не имеет закрывающий ] и объект верхнего уровня JSon не хватает другого закрытия }), так что давайте предположим, что это так:

{ 
    "jailbreaks": [ 
    { 
     "jailbroken": false, 
     "name": "", 
     "version": "", 
     "url": "", 
     "anleitung": [], 
     "ios": { 
     "start": "10.2.1", 
     "end": "" 
     }, 
     "platforms": [], 
     "caveats": "" 
    }, 
    { 
     "jailbroken": true, 
     "name": "Yalu102", 
     "version": "beta 6", 
     "url": "https://domain-dl.tld", 
     "anleitung": [ 
     { 
      "blog": "title", 
      "link": "http://domain.tld/" 
     }, 
     { 
      "blog": "Test", 
      "link": "http://google.at" 
     } 
     ], 
     "ios": { 
     "start": "10.2", 
     "end": "" 
     }, 
     "platforms": [ 
     "Windows", 
     "OS X", 
     "Linux" 
     ], 
     "caveats": "some text here" 
    } 
    ] 
} 

Структура данных Jailbreaks (первый один), маршалы-к/демаршализует-от этого должным образом: JSON

type Jailbreaks struct { 
    List []Jailbreak `json:"jailbreaks"` 
} 

type Jailbreak struct { 
    Jailbroken bool `json:"jailbroken"` 
    Name  string `json:"name"` 
    Version string `json:"version"` 
    URL  string `json:"url"` 
    Anleitung []struct { 
     Name string `json:"blog"` 
     Link string `json:"link"` 
    } `json:"anleitung"` 

    Firmwares struct { 
     Start string `json:"start"` 
     End string `json:"end"` 
    } `json:"ios"` 

    Platforms []string `json:"platforms"` 
    Caveats string `json:"caveats"` 
} 

как вы видите Anleitung объявлен как срез (не карта).

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

  • Нет связанных вопросов^_^