C# 将对象转换为 json 字符串,其中 属性 名称作为 class 的字符串值

C# convert object to json string with property name as string value of class

我有以下 class 结构:

public class JsonModel
{
    public string PropertyName { get; set; }
    public string PropertyValue { get; set; }
}

我有一个 class 的实例如下:

var entry = new JsonModel { PropertyName = "foo", PropertyValue = "bar" };

我想将其转换为 json,但我希望它变成这样:

{
    "foo": "bar"
}

有人知道我该怎么做吗?我确定它一定很简单?

在大多数编程语言中,包括 C#,序列化到 JSON 的常见方式是将字段的名称作为键名,将字段的值作为值。

您要实现的是以某种方式耦合两个不同的领域,这不是一件常见的事情。

要输出键值对,只需在接口中指定键和值是什么即可。在你的情况下:

public interface IKVP
{
    string PropertyName { get; set; }
    string PropertyValue { get; set; }
}

然后你可以输出任何符合接口的class:

public class JsonModel : IKVP
{
    public string PropertyName { get; set; }
    public string PropertyValue { get; set; }
}

完成后,创建一个扩展方法,它只需要 class 个实现接口的方法:

public static class ClassConverter
{
    public static string ToJson<T>(this T value)  where T : IKVP
      => $"{{ \x22{value.PropertyName}\x22 : \x22{value.PropertyValue}\x22  }}";

}

完成后,输出 json 字符串:

var entry = new JsonModel { PropertyName = "foo", PropertyValue = "bar" };

var json = entry.ToJson(); // { "foo" : "bar"  }

根据更复杂情况的需要在此基础上构建。

假设您的 class 只有 2 个属性(名称和值),您可以使用这个

var entry = new JsonModel { PropertyName = "foo", PropertyValue = "bar" };
    
var json=   GetJson(entry);
 
public string GetJson(object obj)
{  
    var prop= obj.GetType().GetProperties();
   
   var prop1=prop[0].GetValue(obj, null).ToString();
   var prop2= prop[1].GetValue(obj, null).ToString();

    return "{\n\"" + $"{prop1}\": \"{prop2}" + "\"\n}";
}

json

{
 "foo": "bar"
}

如果你想使用序列化器,可以这样做

public string GetJsonFromParsing(object obj)
{
    var json=JsonConvert.SerializeObject(obj);
    var properties=JObject.Parse(json).Properties().ToArray();

    var prop1 = properties[0].Value;
    var prop2 = properties[1].Value;

    return "{\n\"" + $"{prop1}\": \"{prop2}" + "\"\n}";
}

如果您使用 Newtonsoft Json.NET,您可以使用 JsonConverter 实现来处理它。

这是一个相当幼稚的实现:

public class JsonModelConverter : JsonConverter
{
    public override bool CanConvert(Type objectType) => objectType == typeof(JsonModel);

    public override object ReadJson(JsonReader reader, Type objectType,
        object existingValue, JsonSerializer serializer)
    {
        var dict = serializer.Deserialize<Dictionary<string, string>>(reader);
        var item = dict.First();
        return new JsonModel { PropertyName = item.Key, PropertyValue = item.Value };
    }

    public override void WriteJson(JsonWriter writer, object value,
        JsonSerializer serializer)
    {
        var model = (JsonModel)value;
        var dict = new Dictionary<string, string>();
        dict[model.PropertyName] = model.PropertyValue;
        serializer.Serialize(writer, dict);
    }
}

您必须将其传递给 SerializeObjectDeserializeObject<T> 方法,这是一个带有示例输出的用法示例:

void Main()
{
    var t = new Test
    {
        Model = new JsonModel { PropertyName = "key", PropertyValue = "some value" }
    };
    string json = JsonConvert.SerializeObject(t, new JsonModelConverter());
    Console.WriteLine(json);

    var t2 = JsonConvert.DeserializeObject<Test>(json, new JsonModelConverter());
    Console.WriteLine($"{t2.Model.PropertyName}: {t2.Model.PropertyValue}");
}

public class Test
{
    public JsonModel Model { get; set; }
}

输出:

{"Model":{"key":"some value"}}
key: some value