我有以下班级结构:
public class JsonModel
{
public string PropertyName { get; set; }
public string PropertyValue { get; set; }
}
我有一个此类的实例,如下所示:
var entry = new JsonModel { PropertyName = "foo", PropertyValue = "bar" };
我想将其转换为json,但我希望它像这样输出:
{
"foo": "bar"
}
他怎么办不到?
如果您使用 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
假设你的类只有 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}";
}
输出键值对,只需在接口中指定键值对即可。对于你的情况:
public interface IKVP
{
string PropertyName { get; set; }
string PropertyValue { get; set; }
}
然后你可以输出任何遵循该接口的类:
public class JsonModel : IKVP
{
public string PropertyName { get; set; }
public string PropertyValue { get; set; }
}
完成后,创建一个扩展方法,该方法仅采用实现该接口的类:
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" }
根据更复杂情况的需要在此基础上构建。
在大多数编程语言(包括 C#)中,序列化为 JSON 的常见方法是将字段名称作为键名称,将字段值作为值。
您要求实现的是以某种方式在两个不同的领域之间进行耦合,这不是常见的事情。