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);
}
}
您必须将其传递给 SerializeObject
和 DeserializeObject<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
我有以下 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);
}
}
您必须将其传递给 SerializeObject
和 DeserializeObject<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