/ / Xamarin और Golang - { []} अमान्य वर्ण 'x00' ऑब्जेक्ट कुंजी स्ट्रिंग की शुरुआत की तलाश में है - json, go

Xamarin & Golang - {[]} अमान्य वर्ण 'x00' ऑब्जेक्ट कुंजी स्ट्रिंग की शुरुआत की तलाश में - json, go

मैं आज आ रहा हूं क्योंकि मैं फंस गया हूं और यह मेरे लिए तर्क नहीं लगता है।

मेरे पास मेरा सर्वर है (चले जाओ) और मेरा स्मार्टफोन ऐप (ज़मीरिन सी #)।

Xamarin पक्ष के लिए, मैं इस पैकेज का उपयोग कर रहा हूँ -> Xamarin और Windows (PCL) के लिए सॉकेट प्लग इन

गो साइड के लिए, मैं उपयोग कर रहा हूँ एन्कोडिंग/जेसन

Xamarin भाग में सब कुछ ठीक काम कर रहा है। लेकिन गो साइड में, यह "टी.." नहीं है मैं प्रत्येक से संदेशों को संभालने के लिए निम्नलिखित कोड का उपयोग कर रहा हूं 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.RawmMessage सामग्री से एक json को हटा देता है। मुझे पता है कि यह काम करता है, हालांकि जब मैं निम्नलिखित जेसन से अपनी वस्तु को फिर से बनाने का प्रयास करता हूं, तो मुझे यह त्रुटि मिलती है:

(प्रिंट सामग्री ने कोई टिप्पणी नहीं की, फिर डिकोड के पास पढ़ने के लिए कुछ भी नहीं है, यह डिबग ट्रेस परीक्षण के लिए है)

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

इसलिए, जब मैं प्रिंट सामग्री (कॉन) छुपाता हूं, dec.Decode यह देता है:

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

मैं अपने आप से जो चीज पूछता हूं वह है:"क्या x00 का अर्थ एएससीआई टेबल का नल चार्ज है?"। यदि यह त्रुटि इस चार के कारण आती है, तो यह कहाँ है? इसके अलावा, अगर यह यह चार है, तो शायद यह स्ट्रिंग के अंत बिंदु को चिह्नित करने के लिए मौजूद है (चार */चार [] के अंत को चिह्नित करने के लिए सी में "" का उपयोग)।

लेकिन, हो सकता है कि मैं पूरी तरह से गलत हूं.. ईमानदारी से कहूं तो मैं फंस गया हूं और मुझे समझ नहीं आ रहा है.. ऐनवे, JSONLint कहते हैं कि यह एक वैध JSON है, इसलिए यह केवल मेरे विचार से पढ़ने के बारे में कुछ हो सकता है

अगर कोई मदद कर सकता है, धन्यवाद!

उत्तर:

जवाब के लिए 2 № 1

तुंहारे printConn संदेश पढ़ता है, तो dec.Decode(&message) पढ़ने के लिए कुछ नहीं है।


जवाब के लिए 0 № 2

मैंने पाया कि समस्या क्या थी ...

अपने सर्वर/क्लाइंट के बीच संदेशों का आदान-प्रदान करने के लिए मैं JSON फॉर्म का उपयोग करता हूं।


The सर्वर में बना रहा है चले जाओ और का उपयोग करता है encoding/json पैकेज।

The ग्राहक एक है सी # में ज़ामरीन फॉर्म आवेदन और उपयोग करता है Newtonsoft.json पैकेज।


एक बार JSON को क्रमबद्ध करने के बाद, यह एक स्ट्रिंग के रूप में रूप लेता है। हालांकि क्लाइंट/सर्वर के बीच लिखने/पढ़ने के लिए, इसे बाइट्स के रूप में स्वरूपित करना होगा (सी#byte[] && चले जाओ[]byte), तो हमें परिवर्तित करना होगा jsonString एक बाइट सरणी में।

मेरे छद्म के साथ इस रूपांतरण पर एक नज़र डालें 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]

दो सरणी हमारे स्ट्रिंग के लिए बाइट सरणी का प्रतिनिधित्व करती है एमिक्सैम23हालांकि, वे अलग हैं। जैसा कि आप देख सकते हैं, हमारे पास एक है [0] सी # भाग के लिए, गो भाग के विपरीत। इस [0] बायीं ओर बाइट का चिन्ह है.

एक बाइट जो 0 के बराबर होती है मतलब "" और फिर, सी के रूप में एक भाषा के लिए एक स्ट्रिंग का अंत। मुझे लगता है कि गो एक ही काम करता है। अगर मैं सही हूँ तो त्रुटि तर्क है, जब json.Decode() //go मेरे बाइट सरणी पर पुनरावृति, फिर यह अंत तक जाता है जो है "". तो डीकोड मेरे बाइट सरणी के दूसरे मामले में खुद को रोकता है और इस स्ट्रिंग के साथ JSON बनाने का प्रयास करता है "{" जो एक अमान्य JSON है।

बेशक, यह सी # भाग के लिए भी ऐसा ही करता है। मैंने तब इन दो कार्यों को बनाया जो 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;
}

डीबग/प्रिंटिंग के साथ दोनों पक्षों के लिए प्रत्येक डेटा को देखना कभी न भूलें, इससे मदद मिल सकती है!