回答
如何將字符串轉換使用JSON爲對象而不EVAL簡單的例子:
var txt='[\'one\',\'two\']';
var re1='(\\[)'; // Any Single Character 1
var re2='(\\\'.*?\\\')'; // Single Quote String 1
var re3='(,)'; // Any Single Character 2
var re4='(\\\'.*?\\\')'; // Single Quote String 2
var re5='(\\])'; // Any Single Character 3
var p = new RegExp(re1+re2+re3+re4+re5,["i"]);
var m = p.exec(txt);
if (m != null)
{
var c1=m[1];
var s1=m[2];
var c2=m[3];
var s2=m[4];
var c3=m[5];
return [s1, s2];
}
return null;
是這樣一個可怕的方式做到這一點,但它做什麼,它聲稱該字符串:P
你知道......技術上你的JSON字符串的例子是無效的JSON。 :-p – 2010-05-24 19:16:00
我不想在這裏做得很正確,只是給他正確的方向。也是我返回一個哈希不是一個數組 – mkoryak 2010-05-24 19:17:37
JSON有一個well defined grammar這是用來構造一棵樹,然後轉換爲一個對象。
但是如何樹轉換對象? – 2010-05-24 18:47:38
@Fedor - 您所要求的等同於「JSON解析器如何實現」...... – 2010-05-24 19:04:25
@Fedor - 如何實現eval? – orip 2010-05-24 19:12:28
我不知道具體細節,但並不是很難。只是讀取字符和子字符串的一個聰明的組合,解釋它們的意思,並建立一個數據陣列,而你這樣做。像其他解析器一樣。
沒有什麼祕密。你認爲eval()是如何實現的?它使用了與必須解析JSON數據相同的技術,即有效地重新實現eval()的一部分。
JSON是原生表示的數據。它只是JavaScript內置對象格式的創造性實現。作爲本地的,它不需要被「解析」(在程序員需要擔心這樣做的意義上)。
你在說什麼,eval()是適用於JSON的解析器。這是真的,但這不是OP的內容。 – 2010-03-08 16:48:21
我從來沒有說過。 – 2010-03-08 17:03:06
獲取道格拉斯克羅克福德的書,Javascript:好部件。附錄E包括實現JSON解析器的代碼。它不使用eval。
看看我的解析器是一個好主意。這並不完美,但代碼很容易遵循。
public static JsonStructure Parse(string jsonText)
{
var result = default(JsonStructure);
var structureStack = new Stack<JsonStructure>();
var keyStack = new Stack<string>();
var current = default(JsonStructure);
var currentState = ParserState.Begin;
var key = default(string);
var value = default(object);
foreach (var token in Lexer.Tokenize(jsonText))
{
switch (currentState)
{
case ParserState.Begin:
switch (token.Type)
{
case TokenType.BeginObject:
currentState = ParserState.Name;
current = result = new JsonObject();
break;
case TokenType.BeginArray:
currentState = ParserState.Value;
current = result = new JsonArray();
break;
default:
throw new JsonException(token, currentState);
}
break;
case ParserState.Name:
switch (token.Type)
{
case TokenType.String:
currentState = ParserState.NameSeparator;
key = (string)token.Value;
break;
default:
throw new JsonException(token, currentState);
}
break;
case ParserState.NameSeparator:
switch (token.Type)
{
case TokenType.NameSeparator:
currentState = ParserState.Value;
break;
default:
throw new JsonException(token, currentState);
}
break;
case ParserState.Value:
switch (token.Type)
{
case TokenType.Number:
case TokenType.String:
case TokenType.True:
case TokenType.False:
case TokenType.Null:
currentState = ParserState.ValueSeparator;
value = token.Value;
break;
case TokenType.BeginObject:
structureStack.Push(current);
keyStack.Push(key);
currentState = ParserState.Name;
current = new JsonObject();
break;
case TokenType.BeginArray:
structureStack.Push(current);
currentState = ParserState.Value;
current = new JsonArray();
break;
default:
throw new JsonException(token, currentState);
}
break;
case ParserState.ValueSeparator:
var jsonObject = (current as JsonObject);
var jsonArray = (current as JsonArray);
if (jsonObject != null)
{
jsonObject.Add(key, value);
currentState = ParserState.Name;
}
if (jsonArray != null)
{
jsonArray.Add(value);
currentState = ParserState.Value;
}
switch (token.Type)
{
case TokenType.EndObject:
case TokenType.EndArray:
currentState = ParserState.End;
break;
case TokenType.ValueSeparator:
break;
default:
throw new JsonException(token, currentState);
}
break;
case ParserState.End:
switch (token.Type)
{
case TokenType.EndObject:
case TokenType.EndArray:
case TokenType.ValueSeparator:
var previous = structureStack.Pop();
var previousJsonObject = (previous as JsonObject);
var previousJsonArray = (previous as JsonArray);
if (previousJsonObject != null)
{
previousJsonObject.Add(keyStack.Pop(), current);
currentState = ParserState.Name;
}
if (previousJsonArray != null)
{
previousJsonArray.Add(current);
currentState = ParserState.Value;
}
if (token.Type != TokenType.ValueSeparator)
{
currentState = ParserState.End;
}
current = previous;
break;
default:
throw new JsonException(token, currentState);
}
break;
default:
break;
}
}
return result;
}
- 1. 有人可以解釋'&'在這種情況下的工作原理嗎?
- 2. 有人可以請解釋如何路徑工作在PHP包括()情況
- 3. 是否可以在不使用遞歸的情況下編寫JSON解析器?
- 4. 有人可以解釋嗎?
- 5. 有人可以解釋在這種情況下Python的「功能」的概念嗎?
- 6. 有人可以解釋一下嗎?
- 7. 有人可以解釋struts2 XSL ResultType是如何工作的嗎?
- 8. 有人可以解釋Laravel關係是如何工作的嗎?
- 9. 有人可以解釋音譯是如何工作的嗎?
- 10. 有人可以解釋這個stopPropagation是如何工作的嗎?
- 11. 有人可以解釋我如何使用json解析器生成fromList解析函數從AttoParsec
- 12. 我可以在不調用的情況下解析PowerShell腳本塊參數嗎?
- 13. 有人可以解釋下面的代碼是如何工作的嗎?
- 14. 有人可以解釋如何解釋這個logcat嗎?
- 15. 我可以在沒有Python解釋器的情況下構建LLVM嗎?
- 16. 有人可以解釋這個mgiza腳本是如何工作的嗎?
- 17. 任何人都可以解釋CRC在這個特定情況下的工作原理嗎?
- 18. 有人可以向我解釋下面的JS腳本如何工作
- 19. 如何在沒有jQuery的情況下解析JSON
- 20. TDGOTCHI - 有人可以解釋如何使其工作?
- 21. 有人能解釋一下這個RSpec存根是如何工作的嗎?
- 22. 有人可以向我解釋'sigaction'的工作原理嗎?
- 23. 有人可以解釋這個代碼的工作原理嗎?
- 24. 有人可以解釋這個JavaScript的工作原理嗎?
- 25. 有人可以解釋這種遞歸的工作原理嗎?
- 26. 有人可以解釋iOS4的CMTime嗎?
- 27. 任何人都可以解釋以下代碼的工作...?
- 28. 使用JavaScript eval解析JSON
- 29. 可以解釋下面的代碼是如何工作的嗎?
- 30. PowerMock可以在沒有註釋的情況下使用嗎?
的可能重複[JSON數據 - 分析或「Eval'ed(http://stackoverflow.com/questions/1143417/json-data-parsed-or-evaled) – outis 2011-12-26 09:52:06