当前位置: 首页 > 知识库问答 >
问题:

反序列化字符串编码的JSON

百里君博
2023-03-14

有没有一种方法可以正确地反序列化以双引号开头和结尾的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
                }
            }
        }
    }
}

共有1个答案

赵飞语
2023-03-14

你可以试试这个。这是在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; }
}

    
 类似资料:
  • 问题内容: 我有这个字符串: 我正在反序列化对象: 该对象看起来像: 并尝试创建字典: 但得到。 可能是什么问题? 问题答案: 请参阅mridula的答案,了解为什么您会得到null。但是,如果您想直接将json字符串转换为字典,则可以尝试以下代码段。

  • 问题内容: 我有以下类,它是由Jackson映射的(简化版): 在某些情况下,服务器会返回,然后我想将name设置为空的Java String。 是否有任何Jackson注释,或者如果属性为,我应该只检查getter中的null并返回空字符串? 问题答案: 您可以在默认构造函数中或声明时进行设置: 要么

  • 我有以下由Jackson映射的类(简化版): 在某些情况下,服务器返回,然后我想将name设置为空Java字符串。 是否有任何Jackson注释,或者如果属性为,我应该只检查getter中的null并返回空字符串吗?

  • 本文向大家介绍C#实现JSON字符串序列化与反序列化的方法,包括了C#实现JSON字符串序列化与反序列化的方法的使用技巧和注意事项,需要的朋友参考一下 C#将对象序列化成JSON字符串 这里主要是使用JavaScriptSerializer来实现序列化操作,这样我们就可以把对象转换成Json格式的字符串,生成的结果如下: 如何将Json字符串转换成对象使用呢? 在实际开发中,经常有可能遇到用JS传

  • 问题内容: 类型1(docs链接): 类型2(docs链接): 尽管以上两种类型都能完成任务,但这些实现之间有什么区别? 问题答案: 构造之后,两者都调用相同的反序列化功能,因此唯一的区别是泛型类型的处理方式。 第二个是完全静态的,因此类型必须在编译类型中是已知的,并且不能改变。因此,它类似于使用基本Class文字。 第一个是动态的,因此可以用于构造因其参数设置而变化的事物。 就我个人而言,我更喜

  • 我有一个这样的财产: 我需要在其他类中解析时将其作为字符串 但这里是布尔值。 我想我需要做这样的事情。 还有一个像这样的班级 但找不到合适的例子。 这也是