Лемма Pumping для правильных языков является причиной того, что вы не можете этого сделать.
Сгенерированный автомат будет иметь конечное число состояний, например k, поэтому a строка из k + 1 открывающих скобок обязана иметь состояние, повторяющееся где-то (поскольку автомат обрабатывает символы). Часть строки между одним и тем же состоянием может быть продублирована бесконечно много раз, и автомат не узнает разницу.
В частности, если он принимает k + 1 открывающих скобок, за которыми следуют k + 1 замыкающие скобки ( который он должен), он также примет количество накачиваемых открывающих скобок, за которым следуют неизменные k + 1 замыкающие браки (что не должно).
Я использую Json.net в своем проекте, и он отлично работает. В этом случае вы можете сделать это, чтобы проанализировать ваш json:
EDIT: я изменил код, чтобы он читал ваш json-файл (массив)
. Код для синтаксического анализа:
void Main()
{
var json = System.IO.File.ReadAllText(@"d:\test.json");
var objects = JArray.Parse(json); // parse as array
foreach(JObject root in objects)
{
foreach(KeyValuePair<String, JToken> app in root)
{
var appName = app.Key;
var description = (String)app.Value["Description"];
var value = (String)app.Value["Value"];
Console.WriteLine(appName);
Console.WriteLine(description);
Console.WriteLine(value);
Console.WriteLine("\n");
}
}
}
Выход:
AppName
Lorem ipsum dolor sit amet
1
AnotherAppName
consectetur adipisicing elit
String
ThirdAppName
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
Text
Application
Ut enim ad minim veniam
100
LastAppName
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat
ZZZ
Кстати, вы можете использовать LinqPad , чтобы проверить свой код, проще, чем создавать решение или проект в Visual Studio. Я думаю.
вы можете попробовать с помощью System.Web.Script.Serialization.JavaScriptSerializer
:
var json = new JavaScriptSerializer();
var data = json.Deserialize<Dictionary<string, Dictionary<string, string>>[]>(jsonStr);
System.Web.Extensions
в свой проект для доступа к этому классу.
– Chris Stillwell
3 May 2017 в 16:05
Вместо арраиста или словаря вы также можете использовать динамику. Большую часть времени я использую EasyHttp для этого, но уверен, что другие проекты будут делать то же самое. Пример ниже:
var http = new HttpClient();
http.Request.Accept = HttpContentTypes.ApplicationJson;
var response = http.Get("url");
var body = response.DynamicBody;
Console.WriteLine("Name {0}", body.AppName.Description);
Console.WriteLine("Name {0}", body.AppName.Value);
On NuGet: EasyHttp
То, что вы пытаетесь десериализовать в словаре, на самом деле является объектом Javascript, сериализованным в JSON. В Javascript вы можете использовать этот объект как ассоциативный массив, но на самом деле это объект, что касается стандарта JSON.
Таким образом, у вас не было бы проблем десериализации того, что у вас есть со стандартным сериализатором JSON (например, .net, DataContractJsonSerializer и JavascriptSerializer) для объекта (с элементами, называемыми AppName, AnotherAppName и т. д.), но для фактического интерпретации этого как словаря вам понадобится сериализатор, который идет дальше, чем спецификация Json, Я знаю, что есть слова о словарях.
Одним из таких примеров является тот, который все используют: JSON .net
Существует другое решение, если вы не хотите использовать внешнюю библиотеку, которая должна преобразовать ваш объект Javascript в список, прежде чем сериализовать его в JSON.
var myList = [];
$.each(myObj, function(key, value) { myList.push({Key:key, Value:value}) });
теперь, если вы сериализовываете myList для объекта JSON, вы должны быть способный десериализовать до List<KeyValuePair<string, ValueDescription>>
с любым из вышеупомянутых сериализаторов. Этот список тогда будет совершенно очевидным для преобразования в словарь.
Примечание: ValueDescription является этим классом:
public class ValueDescription
{
public string Description { get; set; }
public string Value { get; set; }
}
json:
[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}]
c # code: взять только одно значение, например, слово «велосипед».
//res=[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}]
dynamic stuff1 = Newtonsoft.Json.JsonConvert.DeserializeObject(res);
string Text = stuff1[0].hws[2];
Console.WriteLine(Text);
output:
bike