【问题标题】:Convert Json to string with escape character将 Json 转换为带有转义字符的字符串
【发布时间】:2018-11-20 02:05:22
【问题描述】:

我有 JSON,我需要将其转换为包含特殊字符的字符串。这是我拥有的 JSON:

[{
    "job": {
        "jobName": "Flight_Test_8",
        "fields": {
            "jobGroupName": "ObjectUploader",
            "jobTemplateLibraryName": "Object_Mover_Workflows",
            "jobTemplateName": "ObjectUploader",
            "jobArgs": {
                "ObjectUploader.Source.SourceAgent": "sig_NoWhere_corxf_ny!9",
                "ObjectUploader.Source.Data": "<siglist type=\"filedir\"><el v=\"\\\\is-us-sec01-smb.com\\mxrepository\\test\\TEMP_test\" t=\"d\"></el></siglist>",
                "ObjectUploader.Target.TargetAgent": "sig-dev-lnx-01.NOWHWERE.com",
                "ObjectUploader.Target.TargetObjectStorage": "{\"aws-s3-storage\": {\"bucket\": \"flight-gateway-test\",\"subfolder\": \"\",\"access-key\": \"AKIAJ6EPASSWORDV6TLPYV\",\"secret-key\":\"eklmmlevkqfvcuPASSWORDtpmam\",\"id\": 28716,\"name\": \"S3 AWS East\"}",
                "ObjectUploader.Schedule._sp_frequency": "once"
            }
        }
    }
}

]

现在我要做的是将 JSON 的这个特定部分转换为带有转义字符的字符串,如下所示:

"ObjectUploader.Target.TargetObjectStorage": "{\"aws-s3-storage\": {\"bucket\": \"flight-gateway-test\",\"subfolder\": \"\",\"access-key\": \"AKIAJ6EPASSWORDV6TLPYV\",\"secret-key\":\"eklmmlevkqfvcuPASSWORDtpmam\",\"id\": 28716,\"name\": \"S3 AWS East\"}"

我需要它为字符串格式的原因是因为我的目标是以这种方式接受它。当我做 JsonConvert.SerializeObject(jobList, Formatting.Indented);这就是我得到的:

[{
"job": {
  "jobName": "Flight_Test",
  "fields": {
    "jobGroupName": "ObjectUploader",
    "jobTemplateLibraryName": "Object_Mover_Workflows",
    "jobTemplateName": "ObjectUploader",
    "jobArgs": {
      "ObjectUploader.Source.SourceAgent": "sig_windows",
      "ObjectUploader.Source.Data": "<siglist type=\"filedir\"><el v=\"\\\\is-us-se01.com\\repo\\test\\test\" t=\"d\"></el></siglist>",
      "ObjectUploader.Target.TargetAgent": "sig-dev.com",
      "ObjectUploader.Target.TargetObjectStorage": {
        "aws-s3-storage-access": {
          "BucketName": "flight-test",
          "SubFolder": "TestFolder",
          "AccessKey": "PASSWORD",
          "SecretKey": "PASSWORD",
          "ProfileName": null,
          "BucketId": 28716
        }
      },
      "ObjectUploader.Schedule._sp_frequency": "none"
    }
  }
}

} ]

如您所见,ObjectUploader.Target.TargetObjectStorage 以正确的 JSON 格式序列化,但 API 无法以这种方式对其进行解析,API 接受的唯一格式是带有换行符等的 JSON:

"ObjectUploader.Target.TargetObjectStorage": "{\"aws-s3-storage\": {\"bucket\": \"flight-gateway-test\",\"subfolder\": \"\",\"access-key\": \"AKIAJ6EPASSWORDV6TLPYV\",\"secret-key\":\"eklmmlevkqfvcuPASSWORDtpmam\",\"id\": 28716,\"name\": \"S3 AWS East\"}"

我获得当前所需格式的方式是通过在线网站,但我想知道 C# 是否有一些功能可以为我提供所需的结果。

【问题讨论】:

    标签: c# json serialization json.net


    【解决方案1】:

    您可以创建一个转换器来执行此操作:

    private class StringObjectPropertyConverter<T> : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(T) == objectType;
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType != JsonToken.String)
            {
                throw new Exception("Expected string");
            }
            var serialized = reader.Value.ToString();
            using (TextReader tr = new StringReader(serialized))
            {
                if (existingValue == null)
                {
                    existingValue = serializer.Deserialize(tr, objectType);
                }
                else
                {
                    serializer.Populate(tr, existingValue);
                }
            }
            return existingValue;
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            StringBuilder sb = new StringBuilder();
            using (TextWriter tw = new StringWriter(sb))
            {
                serializer.Serialize(tw, value);
            }
            serializer.Serialize(writer, sb.ToString());
        }
    }
    

    示例用法:

    public class Person
    {
        public string Name { get; set; }
        public string Gender { get; set; }
    }
    
    public class Test
    {
        [JsonConverter(typeof(StringObjectPropertyConverter<Person>))]
        public Person Person { get; set; }
    }
    
    var testObj = new Test()
    {
        Person = new Person() { Name = "John", Gender = "Male" }
    };
    var serialized = Newtonsoft.Json.JsonConvert.SerializeObject(testObj);
    

    生成 JSON:

    {
        "Person": "{\"Name\":\"John\",\"Gender\":\"Male\"}"
    }
    

    同样,它也可以将其反序列化回对象结构。

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 1970-01-01
      • 2016-04-13
      • 2012-03-24
      • 2023-03-31
      • 2016-09-30
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      相关资源
      最近更新 更多