将对象转换为json字符串,属性名称作为类的字符串值

问题描述 投票:0回答:4

我有以下班级结构:

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

我有一个此类的实例,如下所示:

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

我想将其转换为json,但我希望它像这样输出:

{
    "foo": "bar"
}

他怎么办不到?

c# json parsing converters
4个回答
1
投票

如果您使用 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

0
投票

假设你的类只有 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}";
}

-1
投票

输出键值对,只需在接口中指定键值对即可。对于你的情况:

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"  }

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


-2
投票

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

您要求实现的是以某种方式在两个不同的领域之间进行耦合,这不是常见的事情。

© www.soinside.com 2019 - 2024. All rights reserved.