es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Aceptar claves dinámicas en la estructura proto al deserializar JSON.

Mi archivo Proto se ve algo como esto:

message Test {
    Service services = 1;
}

message Service {
    string command = 1;
    string root = 2;
}

Este archivo .proto puede admitir un JSON como este:

{
        "services": {
            "command": "command2",
            "root": "/" 
        },
}

Pero quiero manejar un JSON que se vea así:

   {
            "services": {
                    "service1": {
                        "command": "command1",
                        "root": "/"
                    },
                    "service2": {
                        "command": "command2",
                        "root": "/"
                    },
            },
    }

Entonces, todos los servicios tendrán una estructura común pero el nombre de la llave variará (es decir, service1, service2)

Ahora, quiero leer los datos de test.json y deserializarlos:

var test *Test
err := json.Unmarshal([]byte(file), &test)

¿Qué cambios debo hacer en el archivo .proto para que pueda deserializar este JSON con éxito?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para desempaquetar con éxito el JSON actualizado, necesitamos modificar el mensaje Service en el archivo .proto agregando un campo map para services, donde la clave es una cadena y el valor es el mensaje Service. El archivo .proto actualizado se vería así:

    message Test {
      map<string, service=""> services = 1;
    }
    
    message Service {
      string command = 1;
      string root = 2;
    }
    

    Ahora, podemos desempaquetar el JSON actualizado usando el mismo código:

    var test *Test
    err := json.Unmarshal([]byte(file), &test)
    

    Después de desempaquetar, test.services será un mapa con pares clave-valor donde la clave es el nombre del servicio (por ejemplo, “service1”, “service2”) y el valor es una estructura Service que contiene los campos de comando y raíz.</string,>

Comments are closed.