【问题标题】:C# convert object to json string with property name as string value of classC#将对象转换为json字符串,属性名称作为类的字符串值
【发布时间】:2022-01-27 09:07:25
【问题描述】:

我有以下类结构:

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

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

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

我想把它转换成 json,但我希望它变成这样:

{
    "foo": "bar"
}

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

【问题讨论】:

  • 当然,这很简单。启动StringBuilder,您就可以参加比赛了。但我想你的问题真的是如何自动做到这一点?在这种情况下,您需要更具体。您使用的是哪个序列化库?
  • @PeterRuderman 我很高兴使用任何可以轻松做到这一点的库
  • @Alex 你在课堂上只有 2 个属性吗?
  • 您在询问如何将 转换为 json,但您还标记了问题解析,在这种情况下将是 from json。您能否详细说明您需要两种方式还是只反对json?

标签: c# json parsing converters


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您使用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&lt;T&gt; 方法,这是一个带有示例输出的用法示例:

    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
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        您要实现的是以某种方式在两个不同的字段之间进行耦合,这并不常见。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-01
          相关资源
          最近更新 更多