سؤال

أنا أعمل مع API Twitter، في محاولة للحصول على بيانات JSON من

http://search.twitter.com/trends/current.json

التي تبدو وكأنها:

{"as_of":1268069036,"trends":{"2010-03-08 17:23:56":[{"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""},{"name":"#MusicMonday","query":"#MusicMonday"},{"name":"#MM","query":"#MM"},{"name":"Oscars","query":"Oscars OR #oscars"},{"name":"#nooffense","query":"#nooffense"},{"name":"Hurt Locker","query":"\"Hurt Locker\""},{"name":"Justin Bieber","query":"\"Justin Bieber\""},{"name":"Cmon","query":"Cmon"},{"name":"My World 2","query":"\"My World 2\""},{"name":"Sandra Bullock","query":"\"Sandra Bullock\""}]}}

بيكلتي تبدو وكأنها:

type trend struct {  
 name  string  
 query string  
}  

type trends struct {  
 id string  
 arr_of_trends []trend  
}  

type Trending struct {  
 as_of  string  
 trends_obj trends  
}

ثم تحليل JSON في متغير من النوع Trending. وبعد أنا جديد جدا في JSON، لذا فإن اهتمامي الرئيسي هو التأكد من إعداد بنية البيانات بشكل صحيح لعقد بيانات JSON التي تم إرجاعها.

أنا أكتب هذا في "الذهاب" لمشروع للمدرسة. (هذا ليس جزءا من مهمة معينة، مجرد شيء أتعرض عليه من أجل عرض تقديمي على اللغة)

تحديث: وفقا لتعليق بيترسو، سأذهب إلى مسار Regexp. استخدام:

Cur_Trends := new(Current)
/* unmarshal the JSON into our structures */

//find proper json time-name
aoUnixTime, _, _ := os.Time()

// insert code to find and convert as_of Unix time to aoUnixTime
    aoName := time.SecondsToUTC(aoUnixTime).Format(`"2006-01-02"`)
    fmt.Printf("%s\n", aoName)
    regexp_pattern := "/" + aoName + "/"
    regex, _ := regexp.Compile(regexp_pattern);

    cleaned_json := regex.ReplaceAllString(string(body2), "ntrends")
    os.Stdout.WriteString(cleaned_json)

لا تظهر أي تغييرات. هل سأحدد خطأ Regexp؟ يبدو وكأنه "الذهاب" يسمح فقط Regexp واحد في وقت واحد ...

تحديث: يمكن الآن تغيير التاريخ / الوقت إلى "NRENDRADS" ولكن "Unmarshaling" لا يعمل. يمكنني الحصول على كل شيء انتقل إلى واجهة باستخدام json.decode، ولكن لا يمكن تكرارها ...

أعتقد أن سؤالي الجديد هو، كيف يمكنني التكرار من خلال:

map[as_of:1.268176902e+09 trends:map[ntrends:[map[name:#nowplaying query:#nowplaying] map[name:#imtiredofseeing query:#imtiredofseeing] map[name:#iWillNever query:#iWillNever] map[name:#inmyfamily query:#inmyfamily] map[name:#raiseyourhandif query:#raiseyourhandif] map[name:#ripbig query:#ripbig] map[name:QVC query:QVC] map[name:#nooffense query:#nooffense] map[name:#RIPLaylaGrace query:#RIPLaylaGrace] map[name:Justin Bieber query:"Justin Bieber"]]]]

باستخدام "for ... Range" يعطيني أشياء غريبة ...

هل كانت مفيدة؟

المحلول

تويتر تشتهر به فشل الحش, ، و ال تويتر API. يحصل على درجة الفشل أيضا؛ انه شئ فظيع.

تويتر اتجاهات طريقة البحث الحالية API يمكن التعبير عن الاستجابة (باستخدام اتجاهين فقط لتبسيط الأمثلة) في شكل JSON الكنسي والتطبيع على النحو التالي:

{
    "as_of":1268069036,
    "trends":[
        {"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""},
        {"name":"#MusicMonday","query":"#MusicMonday"},{"name":"#MM","query":"#MM"}
    ]
}

ال as_of التاريخ في وقت UNIX، عدد الثواني منذ 1/1970.

في الذهاب، يمكن وصف هذا عن طريق:

type Trend struct {
    Name  string
    Query string
}

type Current struct {
    As_of  int64
    Trends []Trend
}

twitter mangles شكل json الكنسي الطبيعي لتصبح:

{
    "as_of":1268069036,
    "trends":{
        "2010-03-08 17:23:56":[
            {"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""},
            {"name":"#MusicMonday","query":"#MusicMonday"}
        ]
    }
}

في بعض الأحيان، يقوم Twitter بإرجاع نموذج JSON المكافئ هذا.

{
    "trends":{
        "2010-03-08 17:23:56":[
            {"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""},
            {"name":"#MusicMonday","query":"#MusicMonday"}
        ]
    },
    "as_of":1268069036
}

"2010-03-08 17:23:56": هو اسم كائن JSON. ومع ذلك، إنها - لا معنى لها - شكل سلسلة من as_of.

إذا استبدلنا "2010-03-08 17:23:56": بواسطة اسم الكائن "ntrends": (لاتجاهات متداخلة)، الكتابة فوق الزائدة as_of توقيت السلسلة، لدينا نموذج json المنقح التالي:

{
    "as_of":1268069036,
    "trends":{
        "ntrends":[
            {"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""},
            {"name":"#MusicMonday","query":"#MusicMonday"}
        ]
    }
}

من السهل مسح نموذج Twitter JSON "as_of":, ، اقرأ الرقم التالي كما as_of وقت UNIX وتحويله إلى نموذج اسم JSON على سبيل المثال:

var aoUnixTime int64
// insert code to find and convert as_of Unix time to aoUnixTime
aoName := time.SecondsToUTC(aoUnix).Format(`"2006-01-02 15:04:05":`)

الآن يمكننا فحص نموذج تويتر JSON ل aoName قيمة واستبدالها مع "ntrends": للحصول على نموذج Twitter json المنقح.

عند الذهاب، يمكن وصف نموذج JSON المنقح JSON من قبل:

type Trend struct {
    Name  string
    Query string
}

type NTrends struct {
    NTrends []Trend
}

type Current struct {
    As_of  int64
    Trends NTrends
}

ملاحظة: الحرف الأول من الهيئات والمعرفات الميدانية كبيرة بحيث يمكن تصديرها.

لقد برمجته واختبر هذا النهج ويبدو أنه يعمل. نظرا لأن هذا مشروع مدرسي لك، لم أنشأ التعليمات البرمجية الخاصة بي.

نصائح أخرى

لاف، هذا يبدو وكأنه json التي لا يمكن أن تحليلها. تسحب Twitter هذا النوع من الأشياء الغريبة طوال الوقت في API.

يعد كائن "الاتجاهات" خريطة كائنات تاريخية إلى مجموعة من الموضوعات التي تتجهها. لسوء الحظ، فإن Go Json Parser ليس ذكيا بما يكفي للتعامل مع هذا.

في غضون ذلك، يمكنك تحليل هذا التنسيق يدويا، أو مجرد إجراء بحث عادي للتعبير عن الموضوعات.

في كلتا الحالتين، كنت نشر هذا كقضية الذهاب وشاهد ما يقولون:http://code.google.com/p/go/issues/list.

مراجعة للإجابة السابقة.

استجابة Twitter Twitter API Responds هي في شكل JSON Canonical Canonical والعطب:

{"trends":[{"name":"#amazonfail","url":"http:\/\/search.twitter.com\/search?q=%23amazonfail"},... truncated ...],"as_of":"Mon, 13 Apr 2009 20:48:29 +0000"}

ومع ذلك، فإن أساليب API البحث في Twitter Trends Trends الحالية واليومية والأسبوعية، ومع ذلك، في شكل JSON غير مريح غير ضروري تشبه:

{"trends":{"2009-03-19 21:00":[{"query":"AIG","name":"AIG"},... truncated ...],... truncated ...},"as_of":1239656409}

في انتهاك واضح للقواعد لتغليف الخوارزميات وهياكل البيانات، فإن هذا يكشف بشكل غير ضروري أن تستخدم هذه الأساليب حاليا خريطة أو قاموس على تنفيذها.

لقراءة بيانات JSON من تويتر الاتجاهات الحالية في GO هياكل البيانات، باستخدام حزمة JSON، يمكننا أن نفعل شيئا مشابها لما يلي.

package main

import (
    "fmt"
    "json"
)

type Trend struct {
    Name  string
    Query string
}

type Current struct {
    As_of  int64
    Trends map[string][]Trend
}

var currentTrends = `{"as_of":1268069036,"trends":{"2010-03-08 17:23:56":[{"name":"Happy Women's Day","query":"\"Happy Women's Day\" OR \"Women's Day\""},{"name":"#MusicMonday","query":"#MusicMonday"},{"name":"#MM","query":"#MM"},{"name":"Oscars","query":"Oscars OR #oscars"},{"name":"#nooffense","query":"#nooffense"},{"name":"Hurt Locker","query":"\"Hurt Locker\""},{"name":"Justin Bieber","query":"\"Justin Bieber\""},{"name":"Cmon","query":"Cmon"},{"name":"My World 2","query":"\"My World 2\""},{"name":"Sandra Bullock","query":"\"Sandra Bullock\""}]}}`

func main() {
    var ctJson = currentTrends
    var ctVal = Current{}
    ok, errtok := json.Unmarshal(ctJson, &ctVal)
    if !ok {
        fmt.Println("Unmarshal errtok: ", errtok)
    }
    fmt.Println(ctVal)
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top