【问题标题】:howto Serialize data consist an array using JsonWriter in C#如何在 C# 中使用 JsonWriter 序列化数据组成一个数组
【发布时间】:2018-09-20 04:24:03
【问题描述】:

我正在寻找可以在 C# 中使用 JsonWriter 对包含数组的数据进行序列化的东西?

这是我得到的错误:

ExceptionMessage:“不支持的类型:Module.Model.Acl_Entries[]。使用 JsonSerializer 类获取对象的 JSON 表示。路径 'acl_entries'。” 异常类型:“Newtonsoft.Json.JsonWriterException”

这是我的数据:

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

这是我的控制器:

 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);

    }

这是我的 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;
    }

所以我的问题是,我如何在 C# 中使用 JsonWriter 序列化包含数组的数据,或者也许有人可以给我一个提示。

【问题讨论】:

标签: c# arrays json.net


【解决方案1】:

JsonWriterwriter.WriteStartArray() 的要求是像 [1,2,3,4,5]['a','b','c] 这样的简单对象,即 integerstring 类型的数组。 但是你输入的是object-array

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

JsonWriter 无法获取的类型。所以,你有两个选择:

  1. 将数组对象转化为json字符串,放入对象acl_entries即序列化)为:

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

注意:您也可以使用Newtonsoft.json

  1. 或者正如 OPHow to serialize nested collection using JsonWriter 中解释的那样:

    开始一个数组对象- &gt; 循环遍历所有条目以创建每个条目的对象,然后结束数组对象。

你可以把你的代码改成这样:

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();

注意:您可以修改上述逻辑以获得动态实现,您不必对字段及其值获取器进行硬编码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    相关资源
    最近更新 更多