COMO FAZER dados Serialize consistir uma matriz usando JsonWriter em C #

votos
0

Eu estou procurando algo que pode ser serializar dados que consistem de uma matriz usando JsonWriter em C #?

Este é um erro que im recebendo:

ExceptionMessage: tipo não suportado:.. Module.Model.Acl_Entries [] Use a classe JsonSerializer para obter representação JSON do objeto Path 'acl_entries'. ExceptionType: Newtonsoft.Json.JsonWriterException

Este é o meu dados:

author: {        
            stakeholder_id: stkh-a23ee7909d024a21a54fb60d60089c97,
            username: alex,
            acl_entries: [{
                stakeholder_id: stkh-f8e80f32aad44df6a7a96b20d4fee340,
                stakeholder_name: james,
                stakeholder_type_id: 5            
            }]
        }
    }

Este é o meu Controlador:

 public class AuthorRequest
    {
        public Stakeholder author { get; set; }

    }

    [HttpPut]
    [ActionName(PutUpdateStakeholder)]
    public string PutUpdateStakeholder(AuthorRequest request)
    {                              
        var author = request.author;

        List <Stakeholder> list = _repos.PutUpdateStakeholder(author);


        //Utils.Log(stakeBasic + author );

        return JsonConvert.SerializeObject(list);

    }

Este é o meu JsonWriter:

 public List<Stakeholder> PutUpdateStakeholder(Stakeholder author)
    {

        Utils.Log(Update>>> + author);

        string sMsg = ;

        StringWriter sw = new StringWriter();

        using (JsonWriter writer = new JsonTextWriter(sw))
        {
            writer.Formatting = Formatting.None;

            writer.WriteStartObject();

            object obj = null;

            object fal = false;

            object tr = true;

            object val = 0;               

            writer.WritePropertyName(stakeholder_id);
            writer.WriteValue(author.stakeholder_id);

            writer.WritePropertyName(username);
            writer.WriteValue(author.username);


            writer.WritePropertyName(acl_entries);                        //array

            writer.WriteStartArray();
            //writer.WriteStartObject();

            writer.WriteValue(author.acl_entries);


            //writer.WriteEndObject();
            writer.WriteEnd();               

            writer.WriteEndObject();

        }

         string sParam = param= + sw.ToString();

        string sResp = ;

        Utils.Log(BASIC + sParam);

        List<Stakeholder> list = new List<Stakeholder>();

        if (Utils.GenerateRequest(Stakeholder, sParam, PUT, ref sResp))
        {
            Utils.deserializeStakeholderResp(sResp, ref list, ref sMsg);

            //Utils.Log(BASIC + sParam);
        }
        else
        {
            sMsg += sResp;
        }

        return list;
    }

Então, minha pergunta é, como eu pode serializar dados que consistem de uma matriz usando JsonWriter em C # ou talvez alguém poderia me dar uma dica sobre isso.

Publicado 20/09/2018 em 04:24
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

O que o JsonWriternecessário para um writer.WriteStartArray()é um objecto simples como [1,2,3,4,5]ou ['a','b','c]isto é, é uma matriz do tipo integerou string. Mas o que você está alimentando nele é um object-array:

"acl_entries": [{
            "stakeholder_id": "stkh-f8e80f32aad44df6a7a96b20d4fee340",
            "stakeholder_name": "james",
            "stakeholder_type_id": "5"            
 }]

Que o JsonWriternão é capaz de obter o tipo de. Então, você tem duas opções:

  1. Converter o objeto de matriz em uma string JSON e colocá-lo no objeto acl_entries( iethat é serializá-lo ) como:

    JavaScriptSerializer serializera = new JavaScriptSerializer();
    string res = serializera.Serialize(author.acl_entries);
    jsonWriter.WriteValue(res);
    

Nota: você também pode usar Newtonsoft.jsonpara isso.

  1. Ou como é explicado na Como serializar coleção aninhada usando JsonWriter pelo OP é:

    iniciar um objecto matriz - >laço através de todas as entradas para criar um objecto de cada entrada e depois terminar a matriz de objecto.

você pode alterar o código para algo como isto:

writer.WritePropertyName("acl_entries");
jsonWriter.WriteStartArray();

for (int row = 0; row <= author.acl_entries.Count; row++)
{        
    jsonWriter.WriteStartObject();  

    jsonWriter.WritePropertyName("stakeholder_id");
    jsonWriter.WriteValue(author.acl_entries[row].stakeholder_id);

    jsonWriter.WritePropertyName("stakeholder_name");
    jsonWriter.WriteValue(author.acl_entries[row].stakeholder_name);

    jsonWriter.WritePropertyName("stakeholder_type_id");
    jsonWriter.WriteValue(author.acl_entries[row].stakeholder_type_id);
    jsonWriter.WriteEndObject();

}

jsonWriter.WriteEndArray();

Nota : Você pode modificar a lógica acima para ter uma implementação dinâmica onde você não tem que codificar os campos e as suas getters valor.

Respondeu 20/09/2018 em 07:14
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more