c# - 反序列化字符串编码的 JSON
问题描述
有没有办法正确反序列化以双引号开头和结尾的 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}]
这是片段:
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
}
}
}
}
}
解决方案
你可以试试这个。这已经在 Visual Studio 中测试过并且可以正常工作
Dictionary<string, string> items = null;
var list = new List<Dictionary<string, string>>();
...... your code
using (JsonTextReader reader = new JsonTextReader(sr))
{
reader.SupportMultipleContent = true;
Item item = null;
while (reader.Read())
{
switch (reader.TokenType)
{
case JsonToken.StartArray:
items = new Dictionary<string, string>();
continue;
case JsonToken.StartObject:
item = new Item();
break;
case JsonToken.PropertyName:
item.Key = reader.Value.ToString();
break;
case JsonToken.EndObject:
list.Add(items);
items = new Dictionary<string, string>();
break;
case JsonToken.Integer:
item.Value = reader.Value.ToString();
if (item != null) items.Add(item.Key, item.Value);
item = new Item();
break;
}
}
}
var json = JsonConvert.SerializeObject(list);
var jd = JsonConvert.DeserializeObject(json, typeof( List<ControllerEventJson>));
结果
[
{
"startTime": 1610396717400,
"eventCode": 44,
"eventParam": 5
},
{
"startTime": 1610396717700,
"eventCode": 81,
"eventParam": 56
},
{
"startTime": 1610396717800,
"eventCode": 44,
"eventParam": 4
}
]
班级
public class Item
{
public string Key { get; set; }
public string Value { get; set; }
}
推荐阅读
- python - 我如何在python中销毁最后一个日志对象
- haskell - 以纯/函数式语言(Elm/Haskell)实现自引用/指针
- visual-studio-code - 有没有办法在 VS Code 中禁用选择突出显示?
- javascript - 安全地使用图例定义图例后如何格式化图例中的数字
- android - React Native 屏幕在 Android 顶部被切断
- python - BatchNormalization 是跨批次使用移动平均值还是仅使用每批次?以及如何跨批次使用移动平均线?
- json - 使用动态键解析来自 JSON 的地图列表
- python - 在 Django 服务器上找不到页面 404?
- reactjs - 具有服务器端行模型的外部过滤网格
- objective-c - macOS 是否可以处理预定的本地通知?