![](/img/trans.png)
[英]JSON invalid character '}' looking for beginning of object key string
[英]Xamarin & Golang - { []} invalid character '\x00' looking for beginning of object key string
我今天要來是因為我被卡住了,這對我來說似乎不合邏輯。
我有我的服務器( Go )和我的智能手機應用程序( Xamarin C# )。
對於Xamarin,我正在使用此程序包-> Xamarin和Windows(PCL)的套接字插件
對於Go端,我正在使用encoding / json
Xamarin部分的所有功能都正常運行。 但是在Go方面,它沒有..我正在使用以下代碼來處理來自每個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())
}
因此,這里的類型是讓它知道它是哪種json類型。 然后,從該類型字符串中將json.RawmMessage內容中的json解組到好的對象。 我知道它有效,但是當我嘗試從以下json重新創建對象時,出現此錯誤:
(printContent沒有注釋,然后Decode沒有任何內容可供讀取,用於調試跟蹤測試)
....
Handle new connection.
{
"Type": "Authentication",
"Content": {
"UUID": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6Im1heGltZS1ndWl0dGV0QG91dGxvb2suY29tIiwiZXhwIjoxNDYyNjM4MTkzfQ.DEGJcDYl9Iq4nayo37Rq9ZsK8mrU-V8gU5I8JLO8oLg"
}
}
{ []} EOF
因此, 當我隱藏printContent(conn)時 ,dec.Decode給出了這一點:
....
Handle new connection.
{ []} invalid character '\x00' looking for beginning of object key string
我對自己問的是:“ \\ x00是否表示ascii表的NULL CHAR?”。 如果此錯誤是由於此字符而引起的,那么它在哪里呢? 而且,如果是此char,則可能只是為了標記字符串的結束點而存在(在C中使用'\\ 0'來標記char * / char []的結束)。
但是,也許我完全錯了。.老實說,我被卡住了,我聽不懂.. Aynway, JSONLint說這是有效的JSON,所以只能是我認為的閱讀內容
如果有人可以幫助,謝謝!
您的printConn
讀取消息,然后dec.Decode(&message)
沒什么dec.Decode(&message)
。
我發現了問題所在...
要在服務器/客戶端之間交換消息,我使用JSON形式。
服務器在Go中制作,並使用encoding/json
包。
客戶端是C#中的Xamarin表單應用程序,並使用Newtonsoft.json
包。
JSON序列化后,將采用字符串形式。 但是,要在客戶端/服務器之間進行寫入/讀取,必須將其格式化為字節( C# byte[]
&& Go []byte
),因此我們必須將jsonString
轉換為bytes數組。
用我的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]
這兩個數組代表我們的字符串Emixam23的字節數組,但是它們是不同的。 如您所見,與Go部分不同,C#部分具有[0]
。 [0]
是左邊字節的符號 。
等於0的字節表示'\\0'
,然后是C語言的字符串的結尾。我認為Go的工作原理相同。 如果我是對的,那么錯誤就是邏輯,當json.Decode() //go
遍歷我的字節數組時,它會到達結尾'\\0'
。 因此,解碼會在字節數組的第二種情況下停止運行,並嘗試使用此字符串"{"
創建一個JSON,這是無效的JSON。
當然,對於C#部分也是如此。 然后,我創建了這兩個函數,它們對字節數組進行sign()
和unsign()
。
// 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;
}
永遠不要忘記調試/打印雙方的每個數據,它會有所幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.