如何将地图属性自定义为JSON

时间:2016-05-24 16:04:30

标签: c# json.net

所需的JSON:

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

班级中的属性定义:

public string MyRootAttr { get; set; }

所以,问题是,如果没有使用单个字符串属性定义新类,我如何实现我想要的JSON?

3 个答案:

答案 0 :(得分:2)

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

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

使用Json.net:

if

答案 1 :(得分:2)

如果您不想更改类结构,可以使用自定义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 :(得分:1)

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

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