AMcoder - javascript, python, java, html, php, sql

Գոլանգի ընդհանուր JSON մարշալինգ

Ես աշխատում եմ փոքր սերվեր-հաճախորդ նախագծի վրա, որը հիմնված է JSON հաղորդակցության վրա: Բայց ես բախվում եմ խնդիրների. Ես փորձում եմ պատասխանի կառուցվածք ստեղծել ընդհանուր հաղորդագրության մարմնի հետ: Սա նշանակում է, որ ես ունեմ քարտեզ՝ որպես տող բանալին, և որպես արժեք՝ json հում հաղորդագրություն: Վերջում հաղորդագրության մարմինը պետք է աշխատի ցանկացած տեսակի համար (տողեր, ամբողջ թվեր, զանգվածներ)

package main

import (
   "encoding/json"
   "fmt"
)

type ServerResponse struct {
    Code int                    `json:"code" bson:"code"`
    Type string                 `json:"type" bson:"type"`
    Body map[string]json.RawMessage `json:"body" bson:"body"`
}

func NewServerResponse() *ServerResponse {
    return &ServerResponse{Body: make(map[string]json.RawMessage)}
}





func main(){
    serverResponse := NewServerResponse()
    serverResponse.Code = 100
    serverResponse.Type = "molly"

    serverResponse.Body["string"] = json.RawMessage("getIt")
    serverResponse.Body["integer"] = json.RawMessage{200}
    serverResponse.Body["array"] = json.RawMessage(`["a", "b", "c"]`)


    if d, err  := json.Marshal(&serverResponse); err != nil{
        fmt.Println("Error " + err.Error())
    }else{
        fmt.Println(string(d))
   }
}

Բայց արդյունքը հետևյալն է.

{
  "code":100,
  "type":"molly",
  "body":  {
            "array":"WyJhIiwgImIiLCAiYyJd",
            "integer":"yA==",
            "string":"Z2V0SXQ="
           }
}

Թվում է, թե արժեքները Base64 կոդավորված են և կրկնակի չակերտների ներսում: Tihs-ը պետք է լինի ակնկալվող արդյունքը

{
  "code":100,
  "type":"molly",
  "body":  {
            "array":["a", "b", "c"],
            "integer":200,
            "string":"getIt"
           }
}

Սա նույնիսկ հնարավո՞ր է: Թե՞ յուրաքանչյուր պատասխանի համար պետք է գրեմ կոնկրետ կառուցվածքի տեսակ:

27.03.2017

  • Դե, json.RawMessage-ը հենց այն բանի համար է, ինչ դուք ցանկանում եք անել, բայց դուք իսկապես պետք է պարզեք ձեր կոդը. Օրինակ. getItչի վավեր JSON, քանի որ այն բաց է թողնում կրկնակի չակերտները: Փորձեք json.RawMessage("getIt"): Իսկ ի՞նչ եք կարծում, ինչ է արտադրում json.RawMessage{200}-ը: Խնդրում եմ, կարդացեք, թե ինչ է իրականում json.RawMessage-ը, ապա մտածեք, թե ինչ է տալիս json.RawMessage{200}-ը: Ձեր կոդը չի կոմպիլյացիայի ենթարկվում, և եթե այդպես լիներ, այն չէր արտադրի ձեր ցուցադրած արդյունքը: Խնդրում եմ ուղղեք ձեր հարցը: 27.03.2017
  • Մհ.. Սա մի քիչ տարօրինակ է թվում: JetBrains Gogland IDE-ում կոդը հավաքում և գործարկում է առանց որևէ սխալի: Մինչդեռ նույն կոդը ձախողվում է Go Playground-ում: Այսպիսով, կարո՞ղ եմ օգտագործել հում հաղորդագրություն միայն օբյեկտների համար: Ոչ մեկ բանալի/արժեք զույգի համար: 27.03.2017
  • Իհարկե, դուք կարող եք օգտագործել այն առանձին արժեքների համար՝ json.RawMessage([]byte("200")) կամ json.RawMessage([]byte("true")): Մեռած պարզ. 27.03.2017

Պատասխանները:


1

Հում հաղորդագրությունը պետք է վավեր լինի JSON:

Ավելացրեք մեջբերումներ տողի վրա՝ այն վավեր JSON տող դարձնելու համար:

serverResponse.Body["string"] = json.RawMessage("\"getIt\"")

JSON համարները տասնորդական բայթերի հաջորդականություն են: Թիվը մեկ բայթի արժեք չէ, ինչպես փորձ է արվել հարցի մեջ:

serverResponse.Body["integer"] = json.RawMessage("200")

Այս մեկն աշխատում է այնպես, ինչպես սպասում էիք:

serverResponse.Body["array"] = json.RawMessage(`["a", "b", "c"]`)

Հարցի ծրագիրը կազմվում և աշխատում է սխալներով: Այդ սխալների ուսումնասիրությունը և դրանք շտկելը հանգեցնում է վերը նշված իմ առաջարկություններին:

Այլընտրանքային մոտեցում է json.RawMessage-ի օգտագործումը interface{}-ով փոխարինելը.

type ServerResponse struct {
  Code int                    `json:"code" bson:"code"`
  Type string                 `json:"type" bson:"type"`
  Body map[string]interface{} `json:"body" bson:"body"`
}

Սահմանեք արձագանքման մարմինը հետևյալ կերպ.

serverResponse.Body["string"] = "getIt"
serverResponse.Body["integer"] = 200
serverResponse.Body["array"] = []string{"a", "b", "c"}

Դուք կարող եք օգտագործել json.RawMessage արժեքները.

serverResponse.Body["array"] = json.RawMessage(`["a", "b", "c"]`)

Խաղահրապարակի օրինակ

27.03.2017
Նոր նյութեր

Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..