【问题标题】:Deserialize JSON array into string array将 JSON 数组反序列化为字符串数组
【发布时间】:2016-05-13 13:14:15
【问题描述】:

假设我有一个 string 代表 JSON 形式的对象数组:

string s = "[{\"name\":\"Person1\"},{\"name\":\"Person2\"}]";

我想要的是一个字符串数组,每个字符串都是 JSON 对象的 字符串表示 - 不是 对象本身。它应该看起来像这样:

string[] s = new string[]
{
     "{\"name\":\"Person1\"}",
     "{\"name\":\"Person2\"}"
};

1) 几乎我尝试的每一次搜索都会得到数百万个关于如何使用(例如)Json.NET 简单地反序列化 JSON 字符串的结果。这不是我想做的。

2) 我尝试构建一个表示对象的类,以临时循环通过反序列化/序列化映射每个对象到数组中的字符串,但对象的架构是可变的(因此我只需要字符串表示)。

3) 我尝试了一些正则表达式来尝试执行此操作,但我的 JSON 字符串可以包含包含 JSON 字符串作为其值的字段(恶心,但超出我的控制),因此嵌套字符转义等让我部分发疯在我决定在这里寻求帮助之前。

这应该很简单吧?有人指点吗?

【问题讨论】:

  • 为什么不想使用 Json.NET?您可以反序列化为 JSON 数组,然后循环遍历数组中的每个对象并将其序列化为字符串,然后将它们放入列表或您拥有的内容中。
  • 我认为反序列化为object(而不是定义所有预期字段的类),然后进行序列化,会导致字段丢失。一开始我考虑了一会儿,然后立即驳回了这个想法,因为“显然行不通”。猜猜鸡蛋在我脸上:)

标签: c# .net json serialization json.net


【解决方案1】:

你为什么不直接使用这个

string s = "[{\"name\":\"Person1\"},{\"name\":\"Person2\"}]";

string[] t = s.Split(',');

我试过了。它只是为您提供所需的字符串数组....

【讨论】:

  • but my JSON string can contain fields that contain JSON strings as their value - 不起作用
  • @Rob 看起来您没有看到字符串数组 string[] s = new string[] { "{\"name\":\"Person1\"}", "{ \"姓名\":\"Person2\"}" };
  • 我确实看过预期的结果。即使忽略他提到的逗号可能存在​​于 json 中的事实(因此不能简单地拆分 ,),您的代码仍将返回 [{"name 而不是 {"namePerson2}] 而不是 Person2}跨度>
  • 嗯...猜猜最初发布问题的人应该选择最好的那个....
  • 您不会通过以逗号分隔来解析 JSON。字段值可以包含逗号,第一个对象可以包含多个字段,同样用逗号分隔。
【解决方案2】:

您需要对其进行反序列化,然后分别对每个对象进行序列化。 例如(使用Newtonsoft.Json):

string json = "[{\"name\":\"Person1\"},{\"name\":\"Person2\"}]";

var objects = JsonConvert.DeserializeObject<List<object>>(json);
var result = objects.Select(obj => JsonConvert.SerializeObject(obj)).ToArray();

产量(作为string[]):

{"name":"Person1"} 
{"name":"Person2"} 

如果您尝试避免反序列化和序列化,您几乎肯定会遇到会破坏您的代码的极端情况。

【讨论】:

  • 我认为反序列化为object(而不是定义所有预期字段的类),然后进行序列化,会导致字段丢失。一开始我考虑了一会儿,然后立即驳回了这个想法,因为“显然行不通”。猜猜鸡蛋在我脸上:) 谢谢
【解决方案3】:
string s = "[{\"name\":\"Person1\"},{\"name\":\"Person2\"}]";
var Json = JsonConvert.DeserializeObject<List<object>>(s);
string[] Jsonn = Json.Select(x => x.ToString()).ToArray();

[] Jsonn 返回字符串数组而不是 JObject 格式的对象数组。

希望这篇文章对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多