【发布时间】: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