【问题标题】:Convert JSON Output to C# List将 JSON 输出转换为 C# 列表
【发布时间】:2017-08-08 22:20:49
【问题描述】:

我有一些 JSON 数据以字符串形式返回(从 VS 文本可视化器复制和粘贴):

{
   "error":0,
   "result":{
      "name":"wjetestuser1",
      "id":"0eu0_User_2_0b4cfb616e648d4792056c1a6e7d801e_null",
      "status":"ACTIVE"
   }
}
{
   "match":[
      [
         "domain.id",
         "=",
         "2"
      ],
      [
         "loginName",
         "=",
         "wjetestuser1"
      ]
   ],
   "return":[
      "name",
      "id",
      "status"
   ]
}

我试图在不使用替换命令的情况下将"result": 之后和{"match": 之前的所有内容都变成一个列表,所以我最终会得到一个看起来像这样的列表:

名称,wjetestuser1 标识,0eu0_User_2_0b4cfb616e648d4792056c1a6e7d801e_null 状态,活动

如果我能得到错误代码状态那是一个奖励,但真的不需要。

我希望有一个简单的(或几个衬里)不涉及使用替换正则表达式命令将字符串分开。

到目前为止,尝试了各种代码,但如果我在 "result": 之前(包括 "result":)和之后(包括 {"match":)进行剥离,这对我有用

s 下面是上面的单行输出

s = commonCode.ExeApiCall(url);
var DSData = new List<KeyValuePair<string, string>>();
var jsonData = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(s);

第 3 行出现错误并出现错误:

阅读完 JSON 内容后遇到的附加文本:{.路径 '',第 1 行,位置 119。

【问题讨论】:

  • Stack Overflow 上有一百万个 JSON 到 C# 的问题,你试过吗?
  • 那么你为什么不向我们展示你的一些努力呢?因为现在你的问题看起来像“请为我写代码”,我们在这里不做。
  • 为什么你有 2 个根元素?
  • 错误消息中的位置 119 是第一个根元素的最后一个括号。您必须将该字符串拆分为两个 json 对象。 (我想知道这是否是他们的 API 中的错误,或者他们希望您做额外的工作来解析多个 json 对象的字符串)。
  • 我知道我以前见过这个:来自 Json.NET 文档Read Multiple Fragments With JsonReader

标签: c# json visual-studio


【解决方案1】:

正如 Rufo 爵士在 this comment 中指出的那样,如果您使用 Newtownsoft 库,您可以 Read Multiple Fragments With JsonReader。来自网站的示例:

public class Role
{
    public string Name { get; set; }
}

public class Main
{
    string json = @"{ 'name': 'Admin' }{ 'name': 'Publisher' }";
    IList<Role> roles = new List<Role>();

    JsonTextReader reader = new JsonTextReader(new StringReader(json));
    reader.SupportMultipleContent = true;

    while (true)
    {
        if (!reader.Read())
            break;

        JsonSerializer serializer = new JsonSerializer();
        Role role = serializer.Deserialize<Role>(reader);
        roles.Add(role);
    }

    foreach (Role role in roles)
        Console.WriteLine(role.Name);
}

我最初的答案是针对这种特殊情况制作最小的 JSON 解析器。 See revision history for that.

【讨论】:

  • 谢谢。最上面的代码集直接工作。第二组,我将字符串 's' 放在 .ToJsons(s) 的括号之间,结果很完美。这比我使用的正则表达式混乱得多。
  • @WayneEvans 仅供参考的朋友:用正则表达式解决它是不可能的。你必须使用堆栈。 some reference to study
  • 用这个 valid JSON 字符串尝试你的扩展方法 {"foo}{5":"bar}{6"}
  • @alex 你必须编写一个(几乎)完整的 json 解析器来拆分根元素,它也可以是一个对象或一个数组。如果你打算写一个,我可以给你一些用于单元测试的 JSON 示例:o)
  • @alex 不需要实现 Json.NET 已经实现的功能(请参阅我对问题的最后评论)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多