gpt4 book ai didi

c# - JSON JObject.Parse 修改json字符串

转载 作者:行者123 更新时间:2023-11-30 17:30:35 29 4
gpt4 key购买 nike

我收到的 Json 格式为:

{
"Type": "value",
"Name": "MeteoStation",
"UniqueAdress": "2C:3A:E8:0F:10:76",
"valuesList": [{
"Value": 23.00,
"Unit": "C",
"Type": "temperature",
"SourceUniqAdress": "2C:3A:E8:0F:10:76",
"TimeCaptured": "2018-03-26T09:36:13.200Z"
}]
}

在我的程序中,我想创建对象 IValuePacket,它是值列表中的一个值。

JObject jobject = JObject.Parse(incomingJson);
var settings = new JsonSerializerSettings {
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore
};
var incommingMessage = JsonConvert.DeserializeObject<MessageEncapsulation>(incomingJson);
string Type = incommingMessage.Type;
string name = incommingMessage.Name;

if (string.IsNullOrWhiteSpace(name))
name = "no name";

if (Type.ToLower().Equals("value")) {
var values = JsonConvert.DeserializeObject<List<IValuePacket>>(jobject["valuesList"].ToString());
}

一切正常,直到我收到上面提到的确切的 json。JObject.Parse 修改值 TimeCaptured 和 jobject 看起来像:

{
"Type": "value",
"Name": "Meteostation",
"UniqueAdress": "2C:3A:E8:0F:10:76",
"valuesList": [{
"Value": 23.00,
"Unit": "C",
"Type": "temperature",
"SourceUniqAdress": "2C:3A:E8:0F:10:76",
"TimeCaptured": "2018-03-26T09:36:13.2Z"
}]}

差别不大,但是 DateTime.ParseExact(value, "yyyy-MM-ddThh:mm:ss.fffZ", System.Globalization.CultureInfo.InvariantCulture);无法解析新值。实际上,我发送的是 201 毫秒而不是 200 毫秒。它有效,但我想为将来的原因玩得开心。

有什么办法可以避免在 Json 中发生变化吗?在解析期间?

最佳答案

它并没有真正修改您的字符串,它只是在您调用 JObject.Parse 时将您的日期字符串解析为 DateTime 对象。如果你这样做:

var obj = JObject.Parse(json);
var values = (JArray) obj["valuesList"];
var time = (JValue) values[0]["TimeCaptured"];
Console.WriteLine(time.Value.GetType());

您注意到 time.ValueDateTime 类型。然后你这样做:

JsonConvert.DeserializeObject<List<IValuePacket>>(jobject["valuesList"].ToString());

通过这样做,您将 valueList 转换回 json,但现在 TimeCapturedDateTime 而不是字符串,因此 DateTime 使用 JSON.NET 默认使用的任何日期时间格式将对象转换为 json 字符串。

您可以通过将 json 解析为 JObject 来避免将看起来像日期的字符串解析为 .NET DateTime 对象,如下所示:

JObject obj;
using (var reader = new JsonTextReader(new StringReader(json))) {
// DateParseHandling.None is what you need
reader.DateParseHandling = DateParseHandling.None;
obj = JObject.Load(reader);
}

TimeCaptured 的类型将是字符串,如您所料。

旁注:无需将 JToken 转换回字符串,然后对该字符串调用 JsonConvert.Deserialize。相反,这样做:

var values = obj["valuesList"].ToObject<List<IValuePacket>>();

关于c# - JSON JObject.Parse 修改json字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49491005/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com