【问题标题】:How to properly dynamically create custom JSON through Serializer如何通过 Serializer 正确动态创建自定义 JSON
【发布时间】:2021-08-25 00:48:02
【问题描述】:

我有一个障碍,我必须将一个简单的 User 类转换为一个非常具体的 JSON,格式为

{"fields": {
            "Name": {
                "stringValue": "test"
            },
            "Password": {
                "stringValue": "Password"
            },
            "email" : {
                "stringValue" : "emailexample"
            }
        }}

其中 stringValue 是包含在变量名称中的类变量的值。到目前为止,我已经尝试创建自己的序列化程序来解决这个问题,但我只能创建一个字段,即

{"Fields": {"email": {"stringValue": "emailexample"}}}

在我收到 Newtonsoft.Json.JsonException 的错误之前:'Newtonsoft.Json.Linq.JProperty cannot have multiple values.',所以我想知道我的做法是否可行(这是我的第一次尝试创建自定义序列化程序),或者我需要以完全不同的方向解决这个问题。到目前为止我尝试过的内容如下。

public override void WriteJson(JsonWriter writer, User value, JsonSerializer serializer)
{
    JToken t = JToken.FromObject(value);

    if (t.Type != JTokenType.Object)
    {
        t.WriteTo(writer);
    }
    else
    {
        JObject o = (JObject) t;
        IList<string> values = o.Properties().Select(p => p.Value.ToString()).ToList();
        IList<string> names = o.Properties().Select(p => p.Name).ToList();

        //o.RemoveAll();
        
        JObject val = new JObject(new JProperty("stringValue", new JValue(values[0])));
        JProperty fields = new JProperty(names[0], val);
        JObject field = new JObject(fields);
        JProperty test = new JProperty("Fields", field);
        for (int i=1; i<names.Count;i++)
        {
            val = new JObject(new JProperty("stringValue", new JValue(values[i])));
            JProperty name = new JProperty(names[i], val);
            JObject jObject = new JObject(name);
            test.Add(jObject);
        }
        
        o.WriteTo(writer);
    }
}

【问题讨论】:

    标签: c# json json.net json-serialization


    【解决方案1】:

    通过简单地添加到 JObject 而不是循环中的测试并在循环结束时创建 JProperty 测试来修复它。

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      相关资源
      最近更新 更多