【问题标题】:How to custom map property to JSON如何自定义映射属性到 JSON
【发布时间】:2016-05-24 16:04:30
【问题描述】:

所需的 JSON:

"MyRootAttr": {
    "value": "My Value"
}

类中的属性定义:

public string MyRootAttr { get; set; }

那么,问题是,如果没有定义一个新的类,只有一个字符串属性,我怎样才能实现我想要的 JSON?

【问题讨论】:

标签: c# json.net


【解决方案1】:

如果你不想改变你的类结构,你可以使用自定义JsonConverter来达到你想要的结果:

class WrappedStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(string));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        string s = (string)value;
        JObject jo = new JObject(new JProperty("value", s));
        jo.WriteTo(writer);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        return (string)jo["value"];
    }
}

要使用它,请将[JsonConverter] 属性添加到您的字符串属性,如下所示:

class Foo
{
    [JsonConverter(typeof(WrappedStringConverter))]
    public string MyRootAttr { get; set; }
}

往返演示:https://dotnetfiddle.net/y1y5vb

【讨论】:

    【解决方案2】:

    正如我在评论中提到的,anonymous type 可以帮助实现这一目标:

    var myObj = new { MyRootAttr = new { value = "My Value" } };
    JavaScriptSerializer js = new JavaScriptSerializer();
    string json = js.Serialize(myObj); //{"MyRootAttr":{"value":"My Value"}}
    

    使用 Json.net:

    string json = JsonConvert.SerializeObject(myObj); //{"MyRootAttr":{"value":"My Value"}}
    

    【讨论】:

      【解决方案3】:

      使用简单的字符串格式或手动构建 json 字符串。

      var str = String.Format("\"MyRootAttr\": {{ \"value\": \"{{0}}\" }}", MyRootAttr);
      

      【讨论】:

      • var str = String.Format("\"MyRootAttr\": {{ \"value\": \"{{0}}\" }}", MyRootAttr);
      猜你喜欢
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      相关资源
      最近更新 更多