0

ASP.NET/C#の場合:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Web.Script.Serialization" %>
<%
JavaScriptSerializer jss = new JavaScriptSerializer();
string[] fruits = new string[3] {"apple","banana","crunchberries"};
string output = jss.Serialize(fruits);
%>
<html>
fruits=<%=output%>
</html>

戻り値fruits=["apple","banana","crunchberries"]

ASP.NET/VB.NETの場合:

<%@ Page Language="VB" %>
<%@ Import Namespace="System.Web.Script.Serialization" %>
<%
dim jss as new JavaScriptSerializer()
dim fruits  = new String(2) {"apple","banana","crunchberries"}
dim output as string =  jss.Serialize(fruits)
 %>
<html>
fruits=<%=output%>
</html>

戻り値fruits=["apple","banana","crunchberries"]

しかし、ASP.NET / JScript.NETでは:

<%@ Page Language="JScript" %>
<%@ Import Namespace="System.Web.Script.Serialization" %>
<%
var jss:JavaScriptSerializer = new JavaScriptSerializer;
var fruits = ["apple","banana","crunchberries"];
var output = jss.Serialize(fruits);
%>
<html>
fruits=<%=output%>
</html>

戻り値fruits=["0","1","2"]

これは完全に壊れているようです。これは、フルーツのデータ型を明示的に宣言することで修正できます。これにより、これが「ネイティブ配列」になります。

<%@ Page Language="JScript" %>
<%@ Import Namespace="System.Web.Script.Serialization" %>
<%
var jss:JavaScriptSerializer = new JavaScriptSerializer;
var fruits:String = ["apple","banana","crunchberries"];
var output = jss.Serialize(fruits);
%>
<html>
fruits=<%=output%>
</html>

戻り値fruits=["apple","banana","crunchberries"]

正しいシリアル化を取得するためにタイプが必須である理由がわかりません。(var fruits = ["apple","banana","crunchberries",5]悪いコードかもしれませんが、JavascriptとJscriptの両方で合法です。)JScript配列はネイティブ配列よりも遅いと思われますが、それでも機能すると思われますよね?

4

2 に答える 2

1

型推論の問題のように見えます。つまり、おそらくJScript.NET["apple","banana","crunchberries"]はintの配列として解釈されます。

objectの代わりにとをとる関数を作成してみることができますJavaScriptSerializer.Serialize。渡された値を調べて、それが何であるかを確認します。

于 2010-07-15T04:14:09.210 に答える
0

私はJavaScriptSerializerを非難してきましたが、この問題は、JScriptが「JScript」データ型と「.NETFramework」データ型で持つスプリットパーソナリティ障害に関連しているようです。

まず、JavaScriptSerializerの免除。このVBの例に示すように、配列内の混合データ型を処理できます。

dim a as string = "apple"
dim b as int32 = 5
dim c as double = 22.22222
dim fruits(2) as  Object
fruits(0) = a
fruits(1) = b
fruits(2) = c
dim output as string =  jss.Serialize(fruits)

["apple",5,22.22222]これは正しいを返します。このコードのJScriptへの移植(スカラーの明示的な型宣言とFrameworkオブジェクトの長さ3の配列のインスタンス化を完備)も正しい答えを提供します。

var a:String="apple";
var b:Int32=5;
var c:Double=22.2;
var fruits:Object = new Object[3];
fruits[0]=a;
fruits[1]=b;
fruits[2]=c;
var output = jss.Serialize(fruits);

しかし、誰もそのようにJavascriptを書きません。代わりに、以下を使用してフレキシブルタイプのスタックを記述します。

var fruits = new Array();
fruits.push("apple");
fruits.push(5);
fruits.push(22.22222);

これは、JScriptの「expando」配列オブジェクトを使用します。JScriptコンテキストにとどまっている限り、これは問題ありませんが、フレームワークで何かを呼び出すと、問題が発生します。

ここでの中心的な問題は、JScriptがJScriptオブジェクトを必要に応じてFramework(CLR)配列およびオブジェクトに変換できないことです。これについては、 JScript10.0配列オブジェクトの説明にある種の警告があります。(「したがって、CLS準拠のメソッドのパラメーターと戻り型に型注釈を付けるときは、Arrayオブジェクトの代わりにSystem.Arrayデータ型を使用してください。」)うわー、JScriptコンパイラーが注目していることをうれしく思います。私のため!

ここでJScript.NETについて良いことを言うのは難しいです。2つの微妙に異なる種類の配列と2つの微妙に異なる種類のオブジェクトがある環境を作るのに苦労しているようです。奇妙なことに、Visual C#2010では、新しい「DLR」ランタイムで実行できる「動的」タイプとExpandoオブジェクトが導入されたばかりなので、おそらく、JScriptの風変わりなバージョンを作成できるようになりました。

于 2010-07-15T15:35:10.980 に答える