【发布时间】:2021-10-22 05:17:42
【问题描述】:
有没有办法正确反序列化以双引号开头和结尾的 JSON 字符串?
数据以流的形式传入(来自 AWS S3 对象)。这是流的内容(注意开头和结尾的双引号):
"[{\"startTime\":1610396717400,\"eventCode\":44,\"eventParam\":5},{\"startTime\":1610396717700,\"eventCode\":81,\"eventParam\":56},{\"startTime\":1610396717800,\"eventCode\":44,\"eventParam\":4}]"
JsonSerializer 似乎没有正确反序列化它。但是,对于以下内容,它可以按预期工作:
[{"startTime":1610396717400,"eventCode":44,"eventParam":5},{"startTime":1610396717700,"eventCode":81,"eventParam":56}]
这是sn-p:
public class ControllerEventJson
{
[JsonProperty("startTime")]
public long StartTime { get; set; }
[JsonProperty("eventCode")]
public int EventCode { get; set; }
[JsonProperty("eventParam")]
public int EventParam { get; set; }
}
class Program
{
static void Main(string[] args)
{
// stream is a MemoryStream
using (StreamReader sr = new StreamReader(stream))
using (JsonTextReader reader = new JsonTextReader(sr))
{
// Required for large JSON objects to avoid errors when streaming
reader.SupportMultipleContent = true;
JsonSerializer serializer = new JsonSerializer();
while (reader.Read())
{
// Deserialize each object in array individually
if (reader.TokenType == JsonToken.StartObject)
{
var obj = serializer.Deserialize<ControllerEventJson>(reader);
// Do something with obj
}
}
}
}
}
【问题讨论】:
-
基本上将值反序列化为 JSON 令牌,你会得到一个字符串,也就是你要反序列化的 JSON 数组。 (它已经被有效地双重编码了。)你有什么理由以流媒体方式这样做吗?使用
File.ReadAllText阅读内容会更简单,除非它真的很大。 -
您拥有的是一个 JSON 对象,编码为 JSON 字符串。你的问题的答案是“首先反序列化字符串,然后反序列化结果”,你的问题的实际解决方案是没有双重序列化开始。 为什么是那个格式的字符串?
-
@JonSkeet 数据将以流的形式进入。在此示例中,我将其简化为打开文件,但 JSON 文件存储在 AWS S3 中。我正在使用他们的 API 将 ResponseStream 复制到 MemoryStream like so。
-
@Jungl:如果您已经将整个内容读入内存,那么在
response.ResponseStream周围创建一个StreamReader并在其上调用ReadToEnd以获取整个JSON 会更简单一个字符串。 -
@JonSkeet 谢谢,我最终这样做是为了得到整个字符串。然后修剪引号的末端并使用 JsonConvert.DeserializeObject 取回一个列表。