【问题标题】:What's the best way to parse dynamic JSON data解析动态 JSON 数据的最佳方法是什么
【发布时间】:2022-01-06 07:29:54
【问题描述】:

想象一个方法接受 2 个字符串参数:

public int Method(string expression, string variables) { ... }

"expression" 应该是一个数学。需要评估的表达式(例如“1 + 2”)。如果除了数字和运算符之外还有其他内容,我需要在"variables" 字符串参数中查找variable,以将该变量替换为它所代表的数字。 (不能保证变量是在"variables" 中定义的,但我相信这里并不重要)。

输入示例:

Method("351 + x", "{ \"x\":69 }");
// Expected output: 420

其他有效"variables" 值示例:

  • { "x":123 }
  • { "x":123, "y":420 }
  • { }
  • { "z":69 }
  • { "abc": 777 }

我想知道什么是从 JSON 中解析和检索数据的好方法(每次可能具有不同的结构(即不同数量的属性和名称)),将其与 @ 中的 variable 映射987654330@字符串?

【问题讨论】:

  • 映射到Dictionary<string, object> 或类似的怎么样?
  • @UweKeim 是的,这似乎是一个很好的解决方案。有没有办法做到这一点没有任何 3rd 方库/nuget 包?我正在解决 HackerRank 上的一个问题,但不确定是否可以使用“Newtonsoft.Json”
  • 我什至不敢自己做。 Newtonsoft FTW!
  • 是的,有道理......而且可能有访问该库的权限,但不幸的是我没有检查过。谢谢你的帮助。简单的解决方案,由于某种原因没有想到...您可以将此作为答案发布,因此如果您愿意,我可以接受:) 再次感谢!

标签: c# json .net formatting string-parsing


【解决方案1】:

就个人而言,我会选择 Newtonsoft.Json 并使用到 Dictionary<string, object> 的映射:

using Newtonsoft.Json;

public int Method(string expression, string variables) 
{ 
    var varsDic = 
        JsonHelper.IsValidJson(variables)
            ? JsonConvert.DeserializeObject<Dictionary<string, object>>(variables);
            : new Dictionary<string, object>()

    // ...
}

Example, documentation.

IsValidJson 是这样的:

public static class JsonHelper
{
    public static bool IsValidJson(string json)
    {
        return IsValidJson(json, out _);
    }

    public static bool IsValidJson(string json, out Exception parseError)
    {
        if (string.IsNullOrWhiteSpace(json))
        {
            parseError = new Exception(Resources.JsonEmpty);
            return false;
        }

        json = json.Trim();
        if (json.StartsWith(@"{") && json.EndsWith(@"}") || //For object
            json.StartsWith(@"[") && json.EndsWith(@"]")) //For array
        {
            try
            {
                JToken.Parse(json);

                parseError = null;
                return true;
            }
            catch (JsonReaderException x)
            {
                parseError = x;
                return false;
            }
            catch (Exception x)
            {
                parseError = x;
                return false;
            }
        }
        else
        {
            parseError = new Exception(Resources.JsonNoStartEnd);
            return false;
        }
    }

See also.

【讨论】:

  • JsonConvert.DeserializeObject 包装在try/catch 中比解析两次更好,一次用于检查,另一次用于数据?
  • @AlexeyRumyantsev 是的,这可能会更高效,但另一方面,在现实世界的场景中它可能可以忽略不计。
猜你喜欢
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2018-07-23
  • 1970-01-01
  • 2013-05-28
相关资源
最近更新 更多