/ / Xamarin e Golang - {[]} carattere non valido "x00" che cerca l'inizio della stringa della chiave dell'oggetto - json, vai

Xamarin & Golang - {[]} carattere non valido 'x00' in cerca dell'inizio della stringa della chiave dell'oggetto - json, go

Vengo oggi perché sono bloccato e non mi sembra logico.

Ho il mio server (Partire) e l'app per smartphone (Xamarin C #).

Per il lato Xamarin, sto usando questo pacchetto -> Plugin Sockets per Xamarin e Windows (PCL)

Per il lato Go, sto usando codifica / json

Tutto nella parte Xamarin funziona correttamente. Ma nel lato Go, non funziona. Sto usando il seguente codice per gestire i messaggi di ciascuno net.Conn.

type DialMessageContainer struct {
Type string `json:"Type"`
Content json.RawMessage `json:"Content"`
}

func (dialTCP *DialTCP) serve_conn(conn net.Conn) {

fmt.Println("Handle new connection.")
dec := json.NewDecoder(conn)
var message m.DialMessageContainer

//Use one of the following
printContent(conn)
// --
err := dec.Decode(&message)
fmt.Println(message, err)
//End

conn.Close()
}

func printContent(conn net.Conn) {
var buf bytes.Buffer
io.Copy(&buf, conn)
fmt.Println(buf.String())
}

Quindi, il tipo è qui per fargli sapere quale tipo dijson lo è. Da questo tipo di stringa, quindi rimuove un json dal contenuto json.RawmMessage all'oggetto buono. So che funziona, tuttavia quando provo a ricreare il mio oggetto dal seguente json, ottengo questo errore:

(printContent non commentato, quindi Decode non ha nulla da leggere, è per il test della traccia di debug)

....
Handle new connection.
{
"Type": "Authentication",
"Content": {
"UUID": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im1heGltZS1ndWl0dGV0QG91dGxvb2suY29tIiwiZXhwIjoxNDYyNjM4MTkzfQ.DEGJcDYl9Iq4nayo37Rq9ZsK8mrU-V8gU5I8JLO8oLg"
}
}
{ []} EOF

Così, quando nascondo la stampa Contenuto (conn), il dec.Decode fornisce questo:

....
Handle new connection.
{ []} invalid character "x00" looking for beginning of object key string

La cosa che mi chiedo è:"X00 indica il CARATTERE NULL della tabella ascii?". Se questo errore è dovuto a questo carattere, dov'è? Inoltre, se è questo carattere, forse è presente solo per contrassegnare il punto finale della stringa (utilizzare "" in C per contrassegnare la fine di un carattere * / char []).

Ma forse mi sbaglio completamente .. Onestamente sono bloccato e non capisco .. Aynway, JSONLint dice che è un JSON valido quindi può essere solo qualcosa sulla lettura che penso

Se qualcuno può aiutare, grazie!

risposte:

2 per risposta № 1

Il tuo printConn legge il messaggio, quindi dec.Decode(&message) non ha niente da leggere.


0 per risposta № 2

Ho scoperto qual era il problema ...

Per scambiare messaggi tra il mio server / client utilizzo il modulo JSON.


Il server sta arrivando Partire e usa il encoding/json pacchetto.

Il cliente è un Applicazione modulo Xamarin in C # e usi Newtonsoft.json pacchetto.


Una volta serializzato, un JSON assume la forma di una stringa. Tuttavia per scrivere / leggere tra client / server, deve essere formattato come byte (C #byte[] && Partire[]byte), quindi dobbiamo convertire il file jsonString in una matrice di byte.

Dai un'occhiata a questa conversione con il mio Pseudo Emixam23:

// C#
Emixam23 == [69][0][109][0][105][0][120][0][97][0][109][0][50][0][51][0]

// Go
Emixam23 == [69][109][105][120][97][109][50][51]

I due array rappresentano l'array di byte per la nostra stringa Emixam23, tuttavia, sono differenti. Come puoi vedere, abbiamo un file [0] per la parte C #, a differenza della parte Go. Questo [0] è il segno del byte a sinistra.

Un byte che è uguale a 0 significa "" e poi, la fine di una stringa per una lingua come C. Penso che Go funzioni allo stesso modo. Se ho ragione allora l'errore è logico, quando json.Decode() //go itera sul mio array di byte, quindi va alla fine che è "". Quindi la decodifica si ferma al secondo caso del mio array di byte e prova a creare un JSON con questa stringa "{" che è un JSON non valido.

Ovviamente, fa lo stesso per la parte C #. Ho quindi creato queste due funzioni che sign() e unsign() un array di byte.

// for both, bytes[] is the byte array you want to convert and
// the lenght of this byte array when you call the function
public byte[] UnsignByteArray(byte[] bytes, int lenght)
{
int index = 0;
int i = 0;
var array = new byte[lenght / 2];

while (index < lenght)
{
array[i] = bytes[index];
index += 2;
i++;
}

return array;
}
public byte[] SignByteArray(byte[] bytes, int lenght)
{
int index = 0;
int i = 0;
var array = new byte[lenght * 2];

while (index < lenght)
{
array[i] = bytes[index];
i++;
index++;
array[i] = 0;
i++;
}

return array;
}

Non dimenticare mai di dare un'occhiata con Debug / Stampa tutti i dati per entrambi i lati, può aiutare!