In bestimmten Szenarien kann es notwendig sein, JSON-Daten in Teilen oder Abschnitten zu entmarshallen. Die obere Hälfte der Daten könnte beispielsweise die Aktion angeben, die in der unteren Hälfte ausgeführt werden soll, z. B. das Unmarshalling in eine bestimmte Struktur basierend auf dem „Code“ in der oberen Hälfte.
Betrachten Sie die folgenden Beispielstrukturen:
<code class="go">type Range struct { Start int End int } type User struct { ID int Pass int }</code>
Die JSON-Daten könnten beispielsweise wie folgt aussehen:
<code class="json">// Message with "Code" 4, signifying a Range structure { "Code": 4, "Payload": { "Start": 1, "End": 10 } } // Message with "Code" 3, signifying a User structure { "Code": 3, "Payload": { "ID": 1, "Pass": 1234 } }</code>
Um dieses Unmarshalling zu erreichen, können wir das Parsen der unteren Hälfte der JSON-Daten verzögern, bis wir es bestimmt haben der Code in der oberen Hälfte. Betrachten Sie den folgenden Ansatz:
<code class="go">import ( "encoding/json" "fmt" ) type Message struct { Code int Payload json.RawMessage // Delay parsing until we know the code } func MyUnmarshall(m []byte) { var message Message var payload interface{} json.Unmarshal(m, &message) // Delay parsing until we know the color space switch message.Code { case 3: payload = new(User) case 4: payload = new(Range) } json.Unmarshal(message.Payload, payload) // Error checks omitted for readability fmt.Printf("\n%v%+v", message.Code, payload) // Perform actions on the data } func main() { json := []byte(`{"Code": 4, "Payload": {"Start": 1, "End": 10}}`) MyUnmarshall(json) json = []byte(`{"Code": 3, "Payload": {"ID": 1, "Pass": 1234}}`) MyUnmarshall(json) }</code>
Mit diesem Ansatz können Sie je nach angegebenem Code beliebige JSON-Daten effektiv in Abschnitten entmarshallen.
Das obige ist der detaillierte Inhalt vonWie entmarshallt man beliebige JSON-Daten in Abschnitten basierend auf einem Code?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!