JSON 序列化 - 如何取消属性值的引号

JSON serialization - how to unquote a property value?

本文关键字:属性 取消 序列化 何取消 JSON      更新时间:2023-09-26

给定一个类 A ...

public class A { 
  public string Prop1 { get; set; }
  public string Prop2 { get; set; }
}
string jsonString = JsonConvert.SerializeObject(
     new A() { 
        Prop1 = "ABC", 
        Prop2 = "$.jqplot.DateAxisRenderer" }
 );

jsonString 包含...'"{ "提案1":"ABC", ''"Prop2''":''"$.jqplot.日期轴渲染器''"}'";

问题:

如何取消报价 Prop2?

即我希望 jsonString 包含...'"{ "提案1":"ABC", ''"Prop2''":$.jqplot.DateAxisRenderer}'";

以便 Prop2 被评估(在客户端上(作为引用而不是字符串

如果要从 Prop2 中删除引号,可以为类型编写一个 JSON.NET JsonConverter并将属性值输出为"raw"。

但是(这很重要(,您的输出将不再是有效的 JSON。

如果你对此混合解决方案感到满意,下面是一些示例代码(假设你已经在项目中引用了 JSON.NET(:

namespace JsonRawTest
{
    public class AConverter : JsonConverter
    {
        public override bool CanRead { get { return false; } }
        public override bool CanWrite { get { return true; } }
        public override object ReadJson(JsonReader reader, Type objectType,
            object existingValue, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
        public override void WriteJson(JsonWriter writer, object value,
            JsonSerializer serializer)
        {
            A obj = value as A;
            writer.WriteStartObject();
            writer.WritePropertyName("Prop1");
            writer.WriteValue(obj.Prop1);
            writer.WritePropertyName("Prop2");
            writer.WriteRawValue(obj.Prop2);
            writer.WriteEndObject();
        }
        public override bool CanConvert(Type objectType)
        {
            return typeof(A).IsAssignableFrom(objectType);
        }
    }
    public class A
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            var a = new A
            {
                Prop1 = "Some first value",
                Prop2 = "$.jqplot.DateAxisRenderer"
            };
            string json = JsonConvert.SerializeObject(a, 
                new JsonConverter[] { new AConverter() });
            ...
        }
    }
}

您可以将其作为字符串传递给客户端,然后使用 eval() 函数解析字符串,如下所示:

var str = "alert('hello')";
eval(str); //This will execute the alert method.
var str2 = "(function() { return true; })()";
var returned = eval(str2); //Holds value of true