9

アプリケーションをテストしているユーザーに JSON を表示したいと考えています。そのため、ASP.NET コード ビハインド ファイルで REST サービスを呼び出し、多くの JSON を保持する文字列を返します。

次に、それをページの PRE 要素に配置し、beautify を呼び出して読みやすい JSON を作成すると、すべて問題なく、人間が読みやすいコンテンツが表示されます。

ただし、すべての日付は、「/Date(1319266795390+0800)/」のような通常の JSON 形式で表示されます。

私がやりたいのは、JSON (C#) 文字列で、これらの JSON 日付を「通常の」日付に置き換えることです。したがって、その背後にあるコードでは、文字列を PRE 要素に追加する前です。

正規表現について考えていましたが、方法がわかりませんでした...

4

9 に答える 9

14

私はしばらくの間、JSON 文字列で日付を扱ってきましたが、そのための標準的な方法はありません。そのため、非常に多くの異なる方法があります。そもそもJSON仕様で日付の標準フォーマットを指定できればよかったのかも!

マイクロソフトは独自の方法でそれを行っており、1970 年以降のミリ秒を UTC 形式でカウントすると、次のようになります。"/Date(1319266795390+0800)/"

出力に正規表現を使用して以来、上記の文字列をISO-8601 形式に変更してきましたASP.Net JavaScriptSerializer。これは W3C 標準であり、人間が判読できるものであり、ほとんどのブラウザーが日付を文字列にシリアル化する方法です。方法は次のとおりです。

static readonly long DATE1970_TICKS = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).Ticks;
static readonly Regex DATE_SERIALIZATION_REGEX = new Regex(@"\\/Date\((?<ticks>-?\d+)\)\\/", RegexOptions.Compiled);

static string ISO8601Serialization(string input)
{
    return DATE_SERIALIZATION_REGEX.Replace(input, match =>
    {
        var ticks = long.Parse(match.Groups["ticks"].Value) * 10000;
        return new DateTime(ticks + DATE1970_TICKS).ToLocalTime().ToString("yyyy-MM-ddTHH:mm:ss.fff");
    });
}

ニーズを満たすために形式を簡単に変更できます。カスタムの日付と時刻の形式については、こちらの MSDN 記事をご覧ください。

使用方法は次のとおりです。

JavaScriptSerializer ser = new JavaScriptSerializer();
var JsonSrt = ISO8601Serialization(ser.Serialize(DateTime.Now));    // "\"2012-05-09T14:51:38.333\""

アップデート:

サーバーから返された JSON 文字列を JavaScript で微調整して、Regex を使用してより読みやすい形式にする別の方法があります。

var str = "/Date(1319266795390+0800)/";
str.replace(/\/Date\((\d+)\+\d+\)\//, function (str, date) {
    return new Date(Number(date)).toString();
});
于 2012-05-09T14:19:46.017 に答える
5

解決策は、質問に示されている文字列内にあります。JavaScript Date オブジェクトはその形式を解析し、読み取り可能なバージョンを生成するため、Date(1319266795390+0800)「Wed Apr 18 2012 08:13:22 GMT-0500 (Central Daylight Time)」を返します。

文字列からスラッシュを削除するには、replace 関数を正規表現で使用できます: "/Date(1319266795390+0800)/".replace(/\//g, '').

于 2012-04-18T13:21:48.513 に答える
3

これを使用できます:

string date = "/Date(1319266795390+0800)/";
string regex = @"/Date\((.*?)\+(.*?)\)/";
Match match = Regex.Match(date, regex);
DateTime d = new DateTime(1970, 01, 01).AddMilliseconds(long.Parse(match.Result("$1")));
于 2012-05-10T10:07:54.313 に答える
2

シリアル化するクラスが次のようになっているとします。

public class Something
{
    public int ID;
    public string Name;
    public DateTime Date;
}

次のように変更します。

public class Something
    {
        public int ID;
        public string Name;
        public DateTime Date;
        public string HumanReadableDate { get { return Date.ToLongDateString(); } }
    }

または、その追加のプロパティをテスト環境でのみ表示する場合は、次のようにします。

public class Something
    {
        public int ID;
        public string Name;
        public DateTime Date;
        #if DEBUG
        public string HumanReadableDate { get { return Date.ToLongDateString(); } }
        #endif
    }

また、代わりにまたは他の形式.ToLongDateString()を使用できます.ToString("yyyy-MM-dd HH:mm")

于 2012-05-10T21:37:45.563 に答える
1

次のような正規表現として使用します。

(?<= /Date\( ) 
  (?<ticks>[0-9]+)
  ((?<zonesign>[+-])
   (?<zonehour>[0-9]{2})
   (?<zoneminutes>[0-9]{2})
  )?
(?= \)/ )

これは の括弧内の部分に一致します/Date(1319266795390+0800)/Regex.Replace次に、JSON 文字列全体を呼び出して、数値を適切にフォーマットされた に置き換えることができますDateTime

Matchマッチ エバリュエーター デリゲートで取得したオブジェクトを使用して、ティック、ゾーンサイン、ゾーン時間、ゾーン分を抽出し、整数に変換します。

次に、javascript ティックを .NET ティック (*10000 にする必要があります) に変換し、ティックから .NET を構築DateTimeし、タイム ゾーンの時間と分を加算/減算します。を文字列に変換しDateTime、置換として返します。

于 2012-05-07T22:00:36.067 に答える
1

たとえば、ここで定義している dateofbirth の文字列プロパティを作成し、datetime 変数を次のように返します。

    public string DateOfBirthString
    {
        get { return DateOfBirth.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss"); }
        set { DateOfBirth = string.IsNullOrEmpty(value) ? new DateTime(1900, 1, 1) : Convert.ToDateTime(value); }
    }

これは文字列を返すため、クライアント側でも同じになるため、ユーザーから文字列のdateTimeを取得して変換します。

于 2012-05-11T13:13:40.857 に答える
1

Newtonsoft.JSON を使用します。タイプごとに独自のシリアライザーを提供し、必要に応じて日付をシリアル化できます。

http://james.newtonking.com/projects/json-net.aspx

于 2012-05-10T19:02:26.797 に答える
1

JSON が .NET クラスのシリアル化された表現である場合は、 を使用DataContractJsonSerializerしてサーバー上で逆シリアル化するか、複数のクラスを処理するための一般的なソリューションが必要ない場合は、JSON オブジェクトのスタブ クラスを定義することができます。データセット:

string json = "{\"Test\": \"This is the content\"}";
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(TestJson));
var deserialisedContent = ds.ReadObject(new MemoryStream(Encoding.ASCII.GetBytes(json)));

foreach (var field in typeof (TestJson).GetFields())
{
    Console.WriteLine("{0}:{1}", field.Name, field.GetValue(deserialisedContent));
}

...

[DataContract]
private class TestJson
{
    [DataMember]
    public string Test;
}
于 2012-05-09T05:26:13.977 に答える
0
string input = [yourjsonstring]; 
MatchEvaluator me = new MatchEvaluator(MTListServicePage.MatchDate);
string json = Regex.Replace(input, "\\\\/\\Date[(](-?\\d+)[)]\\\\/", me, RegexOptions.None)
于 2014-02-18T15:08:38.590 に答える