Конвертировать Json в строку с escape-символом - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть 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 в строку с escape-символами следующим образом:

"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 # какая-нибудь функция, которая даст мне нужный мне результат.

1 Ответ

0 голосов
/ 20 ноября 2018

Вы можете создать конвертер для этого:

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

Кроме того, он также может десериализовать это обратно в структуру объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...