【问题标题】:Visual Studio 2015 is truncating long strings on Text VisualizerVisual Studio 2015 正在截断 Text Visualizer 上的长字符串
【发布时间】:2016-06-29 18:28:28
【问题描述】:

更新:经过一些研究,我发现这是 Visual Studio 2015 和 Text Visualizer 的问题,您可以看到 here。

要重现它,请打开 QuickWatch (Shift+F9) 并在搜索框中输入 new string(' ', 32769)。之后点击放大镜,你应该会在字符串中间看到一个“...”...

那么,改变我的问题,有没有办法解决这个问题并使它不被截断,所以我可以在没有变通办法的情况下复制?



我有这段代码:

        JArray bundlesJson = (JArray)JObject.Parse(System.IO.File.ReadAllText(Server.MapPath("~/itens.json")))["bundles"]; // file "itens.json" can be found at http://pastebin.com/7K15yAVd
        System.Text.RegularExpressions.Regex rgx = new System.Text.RegularExpressions.Regex(@"(?<sNome>.*?)\/(?<sClasse>.*?)\/(?<sDescricao>.*?)(?:\/(?<sExtras>.*?)\n|\n|$)");
        var text = System.IO.File.ReadAllText(Server.MapPath("~/TextFile1.txt")); // TextFile1.txt is too big to put here, so i've uploaded it here: http://pastebin.com/AtxbYPXc

        var matches = rgx.Matches(text);
        var lstItens = new List<Item>();
        var oJson = new JArray();

        foreach (System.Text.RegularExpressions.Match match in matches)
        {
            var item = new Item()
            {
                sClasse = match.Groups["sClasse"].Value.Trim(),
                sDescricao = match.Groups["sDescricao"].Value.Trim(),
                sNome = match.Groups["sNome"].Value.Trim(),
                sExtras = match.Groups["sExtras"].Value.Trim(),
            };
            item.PreencherListaBundles(bundlesJson.ToString());

            lstItens.Add(item);
        }
        var result = JsonConvert.SerializeObject(lstItens, Formatting.Indented);
        var backResult = JsonConvert.DeserializeObject<List<Item>>(result);

lstItens 列表正确包含所有项目(501 个项目),但当搜索 "Nome":(这是一个必填字段)时,result 字符串仅返回 48 个对象。为什么会这样?

为了举例说明错误,请在result var 中查找项目lstItens[166],如果您搜索"Nome": "Fiddlehead Fern",您会看到该项目不存在...

奇怪的是backResult.Count 将显示 501 个结果,并且似乎包含每个项目,但是使用必填字段“Nome”在 result var 生成的 json 中进行简单搜索将得到 48 个结果,如图所示:


Item.cs:


public class Item
{
    [JsonProperty(PropertyName = "Nome")]
    public string sNome { get; set; }

    [JsonProperty(PropertyName = "Classe")]
    public string sClasse { get; set; }

    [JsonProperty(PropertyName = "Descricao")]
    public string sDescricao { get; set; }

    [JsonProperty(PropertyName = "Extras")]
    public string sExtras { get; set; }

    [JsonProperty(PropertyName = "Bundles")]
    public List<Bundle> lstBundles { get; set; }

    public void PreencherListaBundles(string jsonBundles)
    {
        List<Bundle> lstBundle = JsonConvert.DeserializeObject<List<Bundle>>(jsonBundles.ToString());

        this.lstBundles = new List<Bundle>();

        lstBundle.ForEach(x =>
        {
            if (!lstBundles.Select(y => y.sNome).Contains(x.sNome) && x.lstItens.Select(y => y.sNome).Contains(sNome))
            {
                lstBundles.Add(new Bundle() { sLocal = x.sLocal, sNome = x.sNome, sRecompensa = x.sRecompensa, lstItens = x.lstItens });
            }
        });
    }
}

Bundle.cs


public class Bundle
{
    [JsonProperty(PropertyName = "bundle")]
    public string sNome { get; set; }

    [JsonProperty(PropertyName = "location")]
    public string sLocal { get; set; }

    [JsonProperty(PropertyName = "reward")]
    public string sRecompensa { get; set; }

    [JsonProperty(PropertyName = "items")]
    public List<BundleItem> lstItens { get; set; }

    public class BundleItem
    {
        [JsonProperty(PropertyName = "name")]
        public string sNome { get; set; }

        [JsonProperty(PropertyName = "description")]
        public string sDescricao { get; set; }

        [JsonProperty(PropertyName = "quantity")]
        public int nQuantidade { get; set; }

        [JsonProperty(PropertyName = "quality")]
        public string sQualidade { get; set; }
    }
}

编辑: 看起来该错误在某些机器上没有发生,就像您可以从 Gerard Sexton 的回答中看到的那样,但是当我运行他运行的相同代码时,我仍然得到 48 个结果。更多细节可以在这个讨论中找到:https://chat.stackoverflow.com/rooms/106307/discussion-between-gerard-sexton-and-gabriel-duarte

【问题讨论】:

  • 我无法重现您的问题。如果我这样做JToken.Parse(oJson.ToString()).Count(),我会按预期得到 501。而oJson[166] 可以很容易地在 JSON 字符串中找到,只需执行 Debug.WriteLine(oJson.ToString().Substring(oJson.ToString().IndexOf("Fiddlehead Fern") - 18, 150)) 即可。
  • 您能否创建一个 complete example 来显示您如何确定输出 JSON 字符串 sJson 中缺少 oJson[166]?
  • 您使用的是自定义解析器吗?
  • @StingyJack 我不知道那是什么,所以我想我没有使用那个哈哈
  • @dbc 我添加了更多详细信息...当我运行 Debug.WriteLine(oJson.ToString().Substring(oJson.ToString().IndexOf("Fiddlehead Fern") - 18, 150)) 它确实返回了我对象的一部分,但是当我使用 oJson.ToString() 并搜索时它没有返回"Nome": "Fiddlehead Fern"。我在问题中添加了我从var result = JsonConvert.SerializeObject(lstItens, Formatting.Indented); 收到的完整 json,我认为它与oJson.ToString() 相同,并且我添加了一些用于序列化 json 的类...

标签: c# asp.net asp.net-mvc visual-studio visual-studio-2015


【解决方案1】:

试试这个:

var result = JsonConvert.SerializeObject(lstItens, Formatting.Indented);
//Testing deserialization
var backResult = JsonConvert.DeserializeObject<List<Item>>(result);

结果变量是一个包含正确格式字符串的字符串。

【讨论】:

  • 我昨天已经试过了,没有运气,还是一样的结果(或者更少的结果,现在不记得了)...
  • 不,对我来说很好用。添加了反序列化,backResult 有 501 项。 backResult [166] 具有所有字段,与 oJson[166] 相同。
  • 在反序列化中,它确实返回了 501 个结果,但我现在仔细检查了你传递的序列化行,它只返回了 48 个结果。我通过 Notepad++ 上的 Count 选项检查了它,搜索“Nome”:(在所有根项目中都是必需的属性)。如果您在 json(oJson[166] 的名称)中搜索“Nome”:“Fiddlehead Fern”,它什么也找不到……我将更新我的问题以包含“Item”对象和相关对象。 ..顺便说一句,这是我得到的json:pastebin.com/nQRXaPpr
  • 不,在“result”字符串中按“Nome”搜索,得到 501 个结果。 “backResult”变量也给出了 501 个项目。
  • PS:我正在使用 ConsoleApplication 进行测试。所以,我这边没有截断。
【解决方案2】:

我无法使用 VS2015、JSON.NET 8.0.3 重现该错误。 我已经包含了我的调试器输出。

使用未更改的代码和文件,我得到了 501 个结果,sJson 包含 Fiddlehead Fern,可视化工具显示项目 166。反序列化也可以正常工作。

请检查字符编码之类的东西。您的系统语言环境可能会导致某些行为有所不同。只是一个想法。

【讨论】:

  • 你能把你得到的json字符串贴出来,这样我可以和我得到的比较一下吗?和这个一样吗:pastebin.com/nQRXaPpr?
  • 看到在 backResult var 我得到了 501 个项目,但是当我搜索“Nome”时:在结果字符串中如果只返回 48 个项目,我已经更新了我的问题,请看截图结果很重要...顺便说一句,我也在使用 VS2015 和 JSON.NET 8.0.3。
  • 这是我来自 sJson pastebin.com/WNMYFUtV 的输出。它与您的屏幕截图完全不同。这个pastebin.com/nQRXaPpr 很不一样。
  • 您发布的这个似乎缺少我稍后在问题中添加的 Bundles 属性,您是否使用更新的代码尝试过?
  • 我发现您的输出存在问题。输出的第 579 行是 ...mines or Mushroom Cave.",。它在某处破坏了 JSON 格式。这是我要比较的输出pastebin.com/zLmtuJfd
猜你喜欢
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2015-07-08
  • 2013-10-10
相关资源
最近更新 更多