将JSON格式的字符串插入JSON结构中

时间:2015-12-09 20:38:31

标签: json string json.net

我有一个关于将json格式的字符串插入到json结构中的问题,并且最终版本是一个组合的JSON格式字符串,可以序列化为JSON结构。我正在使用newtonsofts Json.NET

我有以下JSON结构:

public class ResponseJson
{
    [JsonProperty(PropertyName = "header")]
    public ResponseHeader responseHeader { get; set; }

    [JsonProperty(PropertyName = "results")]
    public string responseResults { get; set; }
}

public class ResponseHeader
{
    [JsonProperty(PropertyName = "name")]
    public string name { get; set; }

    [JsonProperty(PropertyName = "version")]
    public string version { get; set; }
}

在代码中,我执行以下操作:

        ResponseJson responseJson = new ResponseJson();
        responseJson.responseHeader = new ResponseHeader()
        {
            name = A_NAME,
            version = A_VERSION
        };
        responseJson.responseResults = resultJson;

        return JsonConvert.SerializeObject(responseJson, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

resultJson是一个格式正确的JSON字符串(在这种情况下,是一个对象数组,但可以是任何JSON格式的)。现在,如果我执行代码,我得到以下(这是预期的,因为"结果"被声明为字符串):

{
    "header":
        {
            "name":"abcd",
            "version":"1.0"
        },
    "results":
        "[{\"data\":{\"level\":\"100\"},\"code\":{\"value\":\"JBC\",\"type\":\"ev\"},\"time\":{\"start\":\"20\",\"end\":\"101\"}}]"
}

我需要的输出是:

{
    "header":
        {
            "name":"abcd",
            "version":"1.0"
        },
    "results":
        [
            {
                "data":
                    {
                        "level":"100"
                    },
                "code":
                    {
                        "value":"JBC",
                        "type":"ev"
                    },
                "time":
                    {
                        "start":"20",
                        "end":"101"
                    }
            }
        ]
}

1 个答案:

答案 0 :(得分:1)

虽然您没有解释如何创建resultJson变量,但是从代码中隐含的是您对结果进行双重序列化:计算“结果”类的数组,将它们序列化为JSON字符串,将字符串存储在ResponseJson类中,然后依次序列化。然后,嵌入式JSON字符串将根据您所看到的JSON标准进行转义。

您需要避免重复序列化数据,例如使用以下数据模型:

public class ResponseJson<T>
{
    [JsonProperty(PropertyName = "header")]
    public ResponseHeader responseHeader { get; set; }

    [JsonProperty(PropertyName = "results")]
    public T responseResults { get; set; }
}

public static class ResponseJson
{
    public static ResponseJson<T> Create<T>(T responseResults, ResponseHeader responseHeader)
    {
        return new ResponseJson<T> { responseResults = responseResults, responseHeader = responseHeader };
    }
}

public class ResponseHeader
{
    [JsonProperty(PropertyName = "name")]
    public string name { get; set; }

    [JsonProperty(PropertyName = "version")]
    public string version { get; set; }
}

然后你会这样做:

        var results = GetResults(); // Get your result data
        var responseJson = ResponseJson.Create(results, new ResponseHeader()
        {
            name = A_NAME,
            version = A_VERSION
        });

        return JsonConvert.SerializeObject(responseJson, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

如果出于某种原因,必须将以前序列化的JSON字符串嵌入为JSON而不是字符串文字,则需要将其重新解析为JToken:< / p>

        string resultJson = GetResultJson(); // Get result json string.
        var responseJson = ResponseJson.Create(JToken.Parse(resultJson), new ResponseHeader()
        {
            name = A_NAME,
            version = A_VERSION
        });

        return JsonConvert.SerializeObject(responseJson, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

Json.NET将外部JSON中的JToken包含为嵌套的JSON而不是字符串文字。

相关问题