簡體   English   中英

將JSON格式的字符串插入JSON結構

[英]Insert JSON formatted string into JSON structure

我有一個關於將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"
                    }
            }
        ]
}

雖然您沒有解釋如何創建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

        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而不是字符串文字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM