2015-08-03 2 views
3

Id нравится работать с JSON в Голанге, в частности, с протоколом JSON с эластичным поиском.Каков наилучший способ работы с вложенными структурами JSON в Голанге?

JSON глубоко вложенный (это простой запрос):

{ 
    "query": { 
     "filtered": { 
      "query": { 
       "match_all": {} 
      }, 
      "filter": { 
       "and": [ 
        { 
         "range" : { 
          "b" : { 
           "from" : 4, 
           "to" : "8" 
          } 
         }, 
        }, 
        { 
         "term": { 
          "a": "john" 
         } 
        } 
       ] 
      } 
     } 
    } 
} 

Эта структура легко сопоставляется с нативной структурой данных в Ruby.

Но с Golang, кажется, вам нужно определить точную структуру с помощью структур (возможно, их программно создать из источника JSON).

Тем не менее, такие вещи, как массивы разных «типов» объектов в JS, требуют работы вокруг и пользовательского кода. Например, ключ «и» в примере JSON. (http://mattyjwilliams.blogspot.co.uk/2013/01/using-go-to-unmarshal-json-lists-with.html).

Есть ли лучший способ работать с JSON в Голанге?

+0

я рекомендую делать фактические структуры. Как и на любом другом языке, вы перебираете массивы разных типов с полиморфизмом. Необходимые структуры в Go аналогичны структурам, которые я буду использовать на любом другом языке. Другие модели могут работать нормально в некоторых ситуациях, но в целом это всего лишь короткое сокращение, на самом деле они не лучше на что-либо, кроме сохранения разработчика на несколько минут вперед. – evanmcdonnal

+0

Не отвечая, потому что у кого-то есть лучшее решение, но вы всегда можете работать с вложенным интерфейсом 'map [string] {}' и '[] interface {}' s. – twotwotwo

+0

Кроме того, если вы хотите использовать что-то вроде структуры карт в Ruby (опять же, я думаю, что это просто плохая практика и будет использовать ее только в инструментах, которые я пишу для собственного использования), тогда вы ищете 'map [string ] interface {} ', но все глупые утверждения cast/type, необходимые для использования ваших данных, быстро превышают строки, сохраненные, не определяя структуры. – evanmcdonnal

ответ

0

для родного голанга, используйте карту [string] interface {} или define struct. для другой способ доступа JSon объект легко может быть JsonPath или Jason

1

Если вы решили пойти по пути структуры, рассмотрим следующий пример:

{"data": {"children": [ 
    {"data": { 
    "title": "The Go homepage", 
    "url": "http://golang.org/" 
    }}, 
    ... 
]}} 

// ----------- 

type Item struct { 
    Title string 
    URL string 
} 

type Response struct { 
    Data struct { 
     Children []struct { 
      Data Item 
     } 
    } 
} 

Источник: http://talks.golang.org/2012/10things.slide#4

1

Один из возможно использовать библиотеку gabs: https://github.com/Jeffail/gabs

Это полезно для синтаксического анализа и генерации сложных json-структур.

Это пример вложенного JSon поколения из README:

jsonObj := gabs.New() 
// or gabs.Consume(jsonObject) to work on an existing map[string]interface{} 

jsonObj.Set(10, "outter", "inner", "value") 
jsonObj.SetP(20, "outter.inner.value2") 
jsonObj.Set(30, "outter", "inner2", "value3") 

Напечатает:

{"outter":{"inner":{"value":10,"value2":20},"inner2":{"value3":30}}} 
Смежные вопросы