我有一个问题,关于将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格式的字符串)。现在,如果我执行代码,我会得到以下内容(这是意料之中的,因为"results"被声明为字符串):
{
"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
变量,但从代码中可以看出,您正在对结果进行双重序列化:您计算一个"result"类数组,将它们序列化为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将把JToken
作为嵌套的Json而不是字符串文字包含在外部Json中。