Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 8

9
votes
answers
20 views
+10

Decoding JSON values in circe where the key is not known at compile time

Suppose I've been working with some JSON like this:

{ "id": 123, "name": "aubergine" }

By decoding it into a Scala case class like this:

case class Item(id: Long, name: String)

This works just fine with circe's generic derivation:

scala> import io.circe.generic.auto._, io.circe.jawn.decode
import io.circe.generic.auto._
import io.circe.jawn.decode

scala> decode[Item]("""{ "id": 123, "name": "aubergine" }""")
res1: Either[io.circe.Error,Item] = Right(Item(123,aubergine))

Now suppose I want to add localization information to the representation:

{ "id": 123, "name": { "localized": { "en_US": "eggplant" } } }

I can't use a case class like this directly via generic derivation:

case class LocalizedString(lang: String, value: String)

…because the language tag is a key, not a field. How can I do this, preferably without too much boilerplate?

沙发
+90

您可以通过几种不同的方式将单例JSON对象解码为案例类,如 LocalizedString 最简单的是这样的:

  import io.circe.Decoder implicit val decodeLocalizedString:Decoder [LocalizedString] = Decoder [Map [String,String]]。map {kvs => LocalizedString(kvs.head._1,kvs.head._2)}   

这样做的缺点是在空的JSON对象上抛出一个异常,并且在行为未定义的情况下不止一个领域。您可以修复这样的问题:

  implicit val decodeLocalizedString:Decoder [LocalizedString] = Decoder [Map [String,String]]。map(_。toList).emap {case List(( k,v))=> 右(LocalizedString(K,v))案例Nil => 左(“空对象,预期单身”)案例_ => 左(“Multiply-fielding object,expected singleton”)}   

这可能是低效的,特别是如果你有可能最终试图解码真正大的JSON对象(这会转换成地图,然后是对的列表,只是为了失败。)。

如果你关心性能,你可以这样写:

  import io.circe.DecodingFailure implicit val decodeLocalizedString:Decoder [LocalizedString] = {c => c.value.asObject match {case Some(obj)if obj.size == 1 => val(k,v)= obj.toIterable.head v.as [String] .map(LocalizedString(k,_))case None => Left(DecodingFailure(“LocalizedString; expect singleton object”,c.history))}}   

然而,这解码了单例对象本身,并且在我们想要的表示中,我们有一个 {“localized”:{...}} 包装器。我们可以在最后用一个额外的行来容纳它:

  implicit val decodeLocalizedString:Decoder [LocalizedString] = Decoder.instance {c =&gt; c.value.asObject match {case Some(obj)if obj.size == 1 =&gt; val(k,v)= obj.toIterable.head v.as [String] .map(LocalizedString(k,_))case None =&gt; Left(DecodingFailure(“LocalizedString; expect singleton object”,c.history))}} .prepare(_。downField(“localized”))< / code>  

这适用于我们更新的 Item 类的一般派生实例:

  import io.circe.generic。 auto._,io.circe.jawn.decode case class Item(id:Long,name:LocalizedString)  

然后:

  scala&gt; val doc =“”“{”id“:123,”name“:{”localized“:{”en_US“:”eggplant“}}}”“”doc:String = {“id”:123,“name” :{“localized”:{“en_US”:“eggplant”}}} scala&gt; val Right(result)= decode [Item](doc)result:Item = Item(123,LocalizedString(en_US,eggplant))  

自定义编码器更直接: < pre> import io.circe。{Encoder,Json,JsonObject},io.circe.syntax._ implicit val encodeLocalizedString:Encoder.AsObject [LocalizedString] = {case LocalizedString(k,v)=&gt; JsonObject(“localized”:= Json.obj(k:= v))}

然后:

  scala&gt; result.asJson res11:io.circe.Json = {“id”:123,“name”:{“localized”:{“en_US”:“eggplant”}}}   

这方法适用于任何数量的“动态”字段 - 您可以将输入转换为 Map [String,Json] JsonObject ,并使用密钥 - 值对直接。 {Encoder,Json,JsonObject},io.circe.syntax._ implicit val encodeLocalizedString:Encoder.AsObject [LocalizedString] = {case LocalizedString(k,v)=&gt; JsonObject(“localized”:= Json.obj(k:= v))}

然后:

  scala&gt; result.asJson res11:io.circe.Json = {“id”:123,“name”:{“localized”:{“en_US”:“eggplant”}}}   

这方法适用于任何数量的“动态”字段 - 您可以将输入转换为 Map [String,Json] JsonObject ,并使用密钥 - 值对直接。 {Encoder,Json,JsonObject},io.circe.syntax._ implicit val encodeLocalizedString:Encoder.AsObject [LocalizedString] = {case LocalizedString(k,v)=&gt; JsonObject(“localized”:= Json.obj(k:= v))}

然后:

  scala&gt; result.asJson res11:io.circe.Json = {“id”:123,“name”:{“localized”:{“en_US”:“eggplant”}}}   

这方法适用于任何数量的“动态”字段 - 您可以将输入转换为 Map [String,Json] JsonObject ,并使用密钥 - 值对直接。 _ implicit val encodeLocalizedString:Encoder.AsObject [LocalizedString] = {case LocalizedString(k,v)=&gt; JsonObject(“localized”:= Json.obj(k:= v))}

然后:

  scala&gt; result.asJson res11:io.circe.Json = {“id”:123,“name”:{“localized”:{“en_US”:“eggplant”}}}   

这方法适用于任何数量的“动态”字段 - 您可以将输入转换为 Map [String,Json] JsonObject ,并使用密钥 - 值对直接。 _ implicit val encodeLocalizedString:Encoder.AsObject [LocalizedString] = {case LocalizedString(k,v)=&gt; JsonObject(“localized”:= Json.obj(k:= v))}

然后:

  scala&gt; result.asJson res11:io.circe.Json = {“id”:123,“name”:{“localized”:{“en_US”:“eggplant”}}}   

这方法适用于任何数量的“动态”字段 - 您可以将输入转换为 Map [String,Json] JsonObject ,并使用密钥 - 值对直接。

0
votes
answers
43 views
+10

過濾JSON陣列使所有MAX值在JavaScript

-3

這是原始數組,過濾JSON陣列使所有MAX值在JavaScript

var dates = 
[ { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '3', amount: '100' }, 
    { user_id: '3', week_number: '3', amount: '100' } ] 

更新

首先,我試圖排序最高week_number值陣列:

var x = dates.sort(function (itemA, itemB) { 
    return itemA.week_number < itemB.week_number; 
    }); 

得到:

[ { user_id: '1', week_number: '3', amount: '100' }, 
    { user_id: '3', week_number: '3', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' }, 
    { user_id: '1', week_number: '2', amount: '100' } ] 

,然後use.filter得到

[ { user_id: '1', week_number: '3', amount: '100' }, 
    { user_id: '3', week_number: '3', amount: '100' },] 

後來我發現reduce方法,但它只返回最高week_number值的對象。

var max = dates.reduce(function(prev, current) { 
    return (prev.week_number > current.week_number) ? prev : current 
    }) 

正如你所見,.filter將完成工作。

非常感謝您提供的所有答案。你是最棒的!!!

+0

比它應該表現出數組對象包含' '4'' –

+0

我的意思是,如果只有一個項目'WEEK_NUMBER:' 4''和多個'WEEK_NUMBER:「3 ''? – RomanPerekhrest

+0

如果你可以保證列表是'week_number'排序,那麼你所需要做的就是在最後開始一個循環,並在'week_number'中斷時包含'week_number:'max'' –

沙发
0
1

使用map方法來獲取所有的week_number。獲得此數組中最大的,現在在filter方法使用該最大值得到匹配對象

var dates = [{ 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '4', 
 
    week_number: '4', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '3', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '3', 
 
    week_number: '3', 
 
    amount: '100' 
 
    } 
 
] 
 

 
var o = dates.map(function(item) { 
 
    return +item.week_number; 
 
}).sort(function(a, b) { 
 
    return a - b 
 
})[dates.length - 1] 
 
console.log(o) 
 
var m = dates.filter(function(elem) { 
 
    return elem.week_number === o.toString(); 
 
}) 
 
console.log(m)

EDIT

在上面的代碼中的地圖功能冗餘的,排序的日期將給予最大WEEK_NUMBER的對象,那麼濾波器可用於獲得所需的結果

var dates = [{ 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '4', 
 
    week_number: '4', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '2', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '1', 
 
    week_number: '3', 
 
    amount: '100' 
 
    }, 
 
    { 
 
    user_id: '3', 
 
    week_number: '3', 
 
    amount: '100' 
 
    } 
 
] 
 

 
var o = dates.sort(function(a, b) { 
 
    return a.week_number - b.week_number 
 
})[dates.length - 1] 
 

 
var m = dates.filter(function(elem) { 
 
    return elem.week_number === o.week_number; 
 
}) 
 
console.log(m)

+0

是的!非常感謝:] –

+0

如果在數組中間有'{user_id:'4',week_number:'4',amount:'100'}',那麼這將不起作用 – RomanPerekhrest

+0

爲什麼'.map()'? OP的原始'.reduce()'會更好(有些修復)。如果你可以假定最大的'week_number'在最後,'.map()'是完全多餘的,因爲你可以做'var o = dates [dates.length-1] .week_number' – 2017-11-11 16:49:49

板凳
0
1

您可以通過檢查week_number來使用單循環方法,並在必要時替換結果集。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }], 
 
    result = dates.reduce(function (r, o, i) { 
 
     return !i || r[0].week_number < o.week_number 
 
      ? [o] 
 
      : r[0].week_number === o.week_number 
 
       ? r.concat(o) 
 
       : r; 
 
    }, []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

如果會有'{user_id:'4',week_number:'4',amount:'100'}'作爲最後一項 – RomanPerekhrest

+0

@RomanPerekhrest,那麼這是行不通的,對,我認爲id應該得到尊重。無論如何, –

+0

似乎OP不考慮任何其他方法 – RomanPerekhrest

地板
0
0

reduce可能不是此任務的最佳工具。相反,循環式的解決方案可能是更好:

var maxWeek = 0; 
var max = []; 
dates.forEach(function(date) { 
    const week = date.week_number; 
    if (week > maxWeek) { 
     maxWeek = week; 
     max = [date]; 
    } 
    else if (week === maxWeek) { 
     max.push(date); 
    } 
}); 

注:我沒有測試此代碼,所以我不能保證沒有錯誤的。

4楼
0
0

隨着Array.sort()功能:

的第一個示例用額外的項目擴展:

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }, { user_id: '4', week_number: '4', amount: '100' }], 
 
    result = []; 
 

 
dates.sort(function(a, b){ return +b.week_number - +a.week_number; }); 
 
result.push(dates[0]); 
 
for (var i=2, len = dates.length; i<=len; i++) { 
 
    if (dates[i].week_number != result[0].week_number) break; 
 
    result.push(dates[i]); 
 
} 
 
console.log(result);

5楼
0
0
var res = [], prev, max; 
for (var i = 0, len = dates.length; i < len; i++) { 
    max = parseInt(dates[i].week_number); 
    if (!res.length) { 
    prev = max; res.push(dates[i]); 
    } else if (prev === max) { 
    res.push(dates[i]); 
    } else if (max > prev) { 
    prev = max; res.length = 0; res.push(dates[i]); 
    } 
} 
6楼
0
0

鑑於名單上week_number排序,它只是一個簡單的反向循環。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }]; 
 

 
var i = dates.length; 
 
var last = dates[--i]; 
 
while (--i !== -1 && dates[i].week_number === last.week_number) { 
 
} 
 

 
var res = dates.slice(i+1); 
 
console.log(res);


或者使用??,雖然你沒有得到制止環。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }]; 
 

 
var res = dates.reduceRight((a, obj) => 
 
    a.length && obj.week_number !== a[a.length-1].week_number ? a : [obj, ...a] 
 
, []); 
 

 
console.log(res);


但是,如果你不能依賴列表的排序順序,那麼你應該使用.reduce()你已經寫了,並在.filter()使用它的結果操作。

var dates = [{ user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '2', amount: '100' }, { user_id: '1', week_number: '3', amount: '100' }, { user_id: '3', week_number: '3', amount: '100' }]; 
 
    
 
var max = dates.reduce((p, c) => +p.week_number > +c.week_number ? p : c).week_number; 
 
var res = dates.filter(d => d.week_number == max) 
 

 
console.log(res);

0
votes
answers
51 views
+10

的Python大青葉等值線繪製

2

我試圖用我從這裏下載GeoJSON的數據文件繪製英國的等值線圖:https://data.gov.uk/dataset/regions-december-2016-full-extent-boundaries-in-england2的Python大青葉等值線繪製

下面是JSON數據的例子:

{ 
    "type":"FeatureCollection", 
    "features":[ 
    { 
     "type":"Feature", 
     "properties":{"objectid":1,"rgn16cd":"E12000001","rgn16nm":"North East","bng_e":417313,"bng_n":600358,"long":-1.72889996,"lat":55.2970314,"st_areashape":8675727008.425964,"st_lengthshape":795456.8022925043}, 
     "geometry":{ 
     "type":"MultiPolygon", 
     "coordinates":[[[[-2.03,55.80991509288915],[-2.030069429494278,55.80991420787532],[-2.0300215494803053,55.80992140589199],[-2.0300040593387223,55.80993039246682], 

我csv文件看起來像這樣: csv

我基本上只是想使用葉子繪製Taxi列。

問題是情節不顯示任何東西。我使用了下面的代碼。

import pandas as pd 
import os 
import json 

# read in population data 
df = pd.read_csv('map-data.csv') 

import folium 
from branca.utilities import split_six 
state_geo = 'Regions_December_2016_Full_Extent_Boundaries_in_England.geojson' 

m = folium.Map(location=[55, 4], zoom_start=5) 
m.choropleth(
    geo_data=state_geo, 
    data=df, 
    columns=['LA-Code', 'Taxi'], 
    key_on='feature.properties.rgn16cd', 
    fill_color='YlGn', 
    fill_opacity=0.7, 
    line_opacity=0.2, 
    legend_name='h', 
    highlight=True 
) 

m 

我認爲這個問題與key_on參數有關。 我可以在JSON文件使用像這樣訪問正確的代碼:

geodata['features'][0]['properties']['rgn16cd'] 

這使我回到了正確的LA碼(E12000001),但它似乎 沒有在上面的代碼工作。我使用的KEY_ON參數的功能,而不是功能也試過,但那個給我一個錯誤

AttributeError的:「NoneType」對象有沒有屬性「得到」

沒有人有任何想法的問題是什麼?謝謝。

沙发
0
1

folium library's documentation on github

To display it in a Jupyter notebook, simply ask for the object representation:

In : m

很可能是你的問題的根源是,你是不是在木星的筆記本。將地圖保存爲html文件並在瀏覽器中打開它可以正常工作,無需更改json文件。試試下面的代碼:

import pandas as pd 
import folium 

# read in population data 
df = pd.read_csv('map-data.csv') 
state_geo = 'Regions_December_2016.geojson' 


m = folium.Map(location=[55, 4], zoom_start=5) 
m.choropleth(
    geo_data=state_geo, 
    data=df, 
    columns=['LA-Code', 'Taxi'], 
    key_on='feature.properties.rgn16cd', 
    fill_color='YlGn', 
    fill_opacity=0.7, 
    line_opacity=0.2, 
    legend_name='h', 
    highlight=True 
) 

m.save("my_map.html") 

要打開腳本中的地圖,可以通過subprocess.callos.system打電話給你的網絡瀏覽器,通過將這些線在腳本的末尾:

import os 
os.system("firefox my_map.html") 
0
votes
answers
50 views
+10

當發送POST請求時,我應該何時JSON.stringify()它或不?

1

雖然從不同的地方看教程和代碼示例,但我注意到有時在代碼中,通過HTTP請求中的「數據」標頭髮送的JSON對象在發送之前會使用JSON.stringify(data)進行處理,並且有時會在不被「串化「首先。當發送POST請求時,我應該何時JSON.stringify()它或不?

var data = { 
    Email: self.registerEmail(), 
    Password: self.registerPassword(), 
    ConfirmPassword: self.registerPassword2() 
}; 

$.ajax({ 
    type: 'POST', 
    url: '/api/Account/Register', 
    contentType: 'application/json; charset=utf-8', 
    data: JSON.stringify(data) 
}).done(function (data) { 
    self.result("Done!"); 
}).fail(showError); 

在這個例子中,如果我理解正確的話,這將data轉換成類似: {"Email":"[email protected]","Password":"Password1!","ConfirmPassword":"Password1!"}

但在這個

從.NET WEB API教程,客戶端代碼使用實例部分來自相同的客戶端代碼:

var loginData = { 
    grant_type: 'password', 
    username: self.loginEmail(), 
    password: self.loginPassword() 
}; 

$.ajax({ 
    type: 'POST', 
    url: '/Token', 
    data: loginData 
}).done(function (data) { 
    self.user(data.userName); 
    // Cache the access token in session storage. 
    sessionStorage.setItem(tokenKey, data.access_token); 
}).fail(showError); 

JSON.stringify()未使用。有什麼區別?如果我的理解正確,HTTP請求是基於文本的,因此我曾經將所有請求串聯起來。

編輯:

這些是KnockoutJS數據綁定元素:

//...Other HTML markups... 

<input class="form-control" type="text" data-bind="value: registerEmail"/> 
//...Other HTML markups... 

<input class="form-control" type="password" data-bind="value: registerPassword"/> 
//...Other HTML markups... 

<input class="form-control" type="password" data-bind="value: registerPassword2" /> 
//...Other HTML markups... 

<input class="form-control" type="text" data-bind="value: loginEmail"/> 
//...Other HTML markups... 

<input class="form-control" type="password" data-bind="value: loginPassword"/> 
+0

我想這是因爲JSON.stringify被調用,如果數據是一個對象,如果它的字符串,它只是直接發送 –

+0

@MrZach從'var data'和'var loginData'判斷,不是他們都JS變量? – CodeIntern

+0

在第一個示例中,您將對象轉換爲字符串並將其設置爲傳遞給ajax函數的對象的屬性「數據」。 第二個例子是你沒有將對象轉換爲字符串(通過JSON.stringify),所以對象的「data」屬性將是一個對象,而不是第一個例子中的字符串。 –

沙发
0
0

兩種方式,您可以將數據發送到後端。如果你發送字符串數據,你需要在後端解析。即使您發送像Array或Object這樣的數據,也可以直接分配給任何變量。

0
votes
answers
53 views
+10

如何從遠程服務器獲取jsonp?

0

請幫忙從遠程服務器獲取JSONP數據:如何從遠程服務器獲取jsonp?

document.addEventListener("DOMContentLoaded", function() { 
    function readresponse(response){ 
     console.log(response); 
    } 
    (function(){ 
     var src = 'http://json-schema.org/draft-04/schema#?callback=readresponse'; 
     var script = document.createElement('SCRIPT'); 
     script.src = src; 
     document.body.appendChild(script); 
    })(); 
}); 

而Chrome瀏覽器選項卡「網絡」顯示200點的狀態和正確的JSON響應

沙发
0
1

如果你看看你的src網址傳回的內容你會看到它是一個JSON而不是JSONP。如果它是JSONP你的??src應該是:

var src = 'http://json-schema.org/draft-04/schema&callback=readresponse' 

,它會返回數據將被包裝爲:

readresponse({...}) 

,而不是僅僅

{...} 

這就是爲什麼你收到解析錯誤。


您可以在此主題閱讀this post瞭解更多信息。

0
votes
answers
58 views
+10

類型錯誤:無法在web服務

0

讀取未定義的屬性「然後」我有這樣的錯誤:類型錯誤:無法在web服務

類型錯誤:未定義

at FactoryMethod.readItemsAndSetStatus (FactoryMethod.tsx:140:6) at FactoryMethod.componentDidMount (FactoryMethod.tsx:77:10)

調試器中斷在這種方法不能讀取屬性「然後」(當時的聲明):

// read items using factory method pattern and sets state accordingly 
    private readItemsAndSetStatus(): void { 
    this.setState({ 
     status: "Loading all items..." 
    }); 

    const factory: ListItemFactory = new ListItemFactory(); 
    factory.getItems(this.props.spHttpClient, this.props.siteUrl, this.props.listName) 
    .then((items: IListItem[]) => { 
     const keyPart: string = this.props.listName === "GenericList" ? "" : this.props.listName; 
     // the explicit specification of the type argument `keyof {}` is bad and 
     // it should not be required. 
     this.setState<keyof {}>({ 
      status: `Successfully loaded ${items.length} items`, 
      ["Details" + keyPart + "ListItemState"] : { 
      items 
      }, 
      columns: buildColumns(items) 
     }); 
    }); 
    } 

工廠代碼是這樣的: (GenericList情況)

import { SPHttpClient, SPHttpClientResponse } from "@microsoft/sp-http"; 
import { IWebPartContext } from "@microsoft/sp-webpart-base"; 
import { IListItem} from "./models/IListItem"; 
import { IFactory } from "./IFactory"; 
import { INewsListItem } from "./models/INewsListItem"; 
import { IDirectoryListItem } from "./models/IDirectoryListItem"; 
import { IAnnouncementListItem } from "./models/IAnnouncementListItem"; 

export class ListItemFactory implements IFactory { 
    private _listItems: IListItem[]; 
    public getItems(requester: SPHttpClient, siteUrl: string, listName: string): Promise<IListItem[]> { 
     switch(listName) { 
      case "GenericList": 
       let items: IListItem[]; 
       // tslint:disable-next-line:max-line-length 
       requester.get(`${siteUrl}/_api/web/lists/getbytitle('${listName}')/items?$select=Title,Id,Modified,Created,Author/Title,Editor/Title&$expand=Author,Editor`, 
       SPHttpClient.configurations.v1, 
       { 
        headers: { 
         "Accept": "application/json;odata=nometadata", 
         "odata-version": "" 
        } 
       }) 
       .then((response: SPHttpClientResponse): Promise<{ value: IListItem[] }> => { 
        return response.json(); 
       }) 
       .then((json: { value: IListItem[] }) => { 
        console.log(JSON.stringify(json.value)); 
        items=json.value.map((v,i)=>({ 
         key: v.id, 
         id: v.id, 
         title: v.title, 
         created: v.created, 
         createdby: v.Author.Title, 
         modified: v.modified, 
         modifiedby: v.Editor.Title       
        })); 
        return items; 
        }); 
       break;  
      case "News": 
       let newsitems: INewsListItem[]; 
       // tslint:disable-next-line:max-line-length 
       requester.get(`${siteUrl}/_api/web/lists/getbytitle('${listName}')/items?$select=Title,Id,Modified,Created,Created By,Modified By,newsheader,newsbody,expiryDate`, 
       SPHttpClient.configurations.v1, 
       { 
        headers: { 
         "Accept": "application/json;odata=nometadata", 
         "odata-version": "" 
        } 
       }) 
       .then((response: SPHttpClientResponse): Promise<{ value: INewsListItem[] }> => { 
        return response.json(); 
       }) 
       .then((json: { value: INewsListItem[] }) => { 
        return this._listItems = json.value; 
       }); 
       break;  
      case "Announcements": 
       let announcementitems: IAnnouncementListItem[]; 
       requester.get(`${siteUrl}/_api/web/lists/getbytitle('${listName}')/items?$select=Title,Id`, 
       SPHttpClient.configurations.v1, 
       { 
        headers: { 
         "Accept": "application/json;odata=nometadata", 
         "odata-version": "" 
        } 
       }) 
       .then((response: SPHttpClientResponse): Promise<{ value: IAnnouncementListItem[] }> => { 
        return response.json(); 
       }) 
       .then((json: { value: IAnnouncementListItem[] }) => { 
        return this._listItems = json.value; 
       }); 
       break;  
      case "Directory": 
       let directoryitems: IDirectoryListItem[]; 
       requester.get(`${siteUrl}/_api/web/lists/getbytitle('${listName}')/items?$select=Title,Id`, 
       SPHttpClient.configurations.v1, 
       { 
        headers: { 
         "Accept": "application/json;odata=nometadata", 
         "odata-version": "" 
        } 
       }) 
       .then((response: SPHttpClientResponse): Promise<{ value: IDirectoryListItem[] }> => { 
        return response.json(); 
       }) 
       .then((json: { value: IDirectoryListItem[] }) => { 
        return this._listItems = json.value; 
       }); 
       break;  
      default: 
       return null; 
     } 
     } 
} 

我Ilistiteminterface代碼

export interface IListItem { 
    [key: string]: any; 
    id: string; 
    title: string; 
    modified: Date; 
    created: Date; 
    modifiedby: string; 
    createdby: string; 
} 

的JSON從服務返回的是:

[{ 
    "Author": { 
     "Title": "Luis Valencia" 
    }, 
    "Editor": { 
     "Title": "Luis Valencia" 
    }, 
    "Id": 1, 
    "ID": 1, 
    "Title": "Generic List Item 1", 
    "Modified": "2017-10-23T20:02:22Z", 
    "Created": "2017-10-23T20:02:22Z" 
    }, 
    { 
    "Author": { 
     "Title": "Luis Valencia" 
    }, 
    "Editor": { 
     "Title": "Luis Valencia" 
    }, 
    "Id": 2, 
    "ID": 2, 
    "Title": "Generic List Item 2", 
    "Modified": "2017-11-07T17:52:34Z", 
    "Created": "2017-11-07T17:52:34Z" 
    } 
] 

調試的東西,我注意到那是什麼時候的JSON地圖顯然是行不通的。 見截圖,項目是未定義

enter image description here

+1

getItems()函數中的開關分支都沒有返回任何東西。你需要實際返回Promise:所以'return requester.get(...)。then(...)' – Duncan

+0

@Duncan說了什麼,你的默認情況下也需要返回一個promise。 –

+0

請精心設計,我不是專家,所以不知道如何解決它 –

沙发
0
1

你不能從getItems返回請求者。在每個case語句中,在請求者之前添加一個return語句。

return requester.get(`${siteUrl}/_api/web/lists/getbytitle('${listName}') ... 

。然後是一個方法和無極無極狀物體,並且由於getItems要麼返回undefined(或在默認情況下,空)則引發錯誤。

+0

不知道我明白了,你能詳細闡述我需要解決的問題和方法嗎? –

+0

例如:'case「Announcements」:return requester.get(...'getItems不知道如何返回給它的調用者,但沒有爲每個開關case返回語句。 – MynockSpit

+0

這個答案並不能真正解決我的問題 –

0
votes
answers
56 views
+10

Instagram.com/username/media不再有效

2

幾個月前,我創建了一個小型網絡應用程序,通過訪問來自instagram.com/username/media的JSON(不是通過API)爲公共配置文件創建風格化的Instagram圖庫。 。我今天去了我的個人網站,發現畫廊不工作。當我開始排除故障時,我發現問題出在這個鏈接上。我現在得到「頁面未找到」。 Instagram是否改變了訪問個人資料的JSON數據的鏈接,或者他們已經完全刪除了API以外的內容?Instagram.com/username/media不再有效

謝謝!

+0

的[從Instagram的獲取圖像的列表的顯式用戶帳戶(可能的複製https://stackoverflow.com/questions/47238978/get-list-of-images-from-instagram-for-explicit-user-account) – Marcel

沙发
0
6

JSON數據已被移動到另一個URL:https://www.instagram.com/ {USER_NAME}/__一個= 1

+0

謝謝!只是爲了將來的參考,這是正式記錄在任何地方的Instagram? – itsseanl

+1

@itsseanl這不是一個官方端點。我想這隻適用於他們的網站。 – yarlson

+3

對於接下來的12張圖片,請使用'max_id'參數中的最後一項('maxId = media.nodes [11] .id')ID:'https://www.instagram.com/{USER_NAME}/?__a = 1&max_id = {maxId}' –

0
votes
answers
54 views
+10

Javascript JSON返回3個項目後插入新行

1

我正在使用Google工作表在我的網站上填充與我參加的聯盟有關的數據。除了一個非常微小的方面,一切都很好。我一直在網上尋找一種方法來做到這一點,似乎無法找到一種資源,讓我有辦法做到這一點。Javascript JSON返回3個項目後插入新行

我在網站上使用Bootstrap 4,並使用卡來顯示我的數據。使用Card-Deck功能,我正在嘗試通過團隊建立一組名單,以便聯盟球員可以看到誰在球隊中。這按預期工作並構建一排卡片。我想要做的只是連續排列3張牌,因爲它實際上會壓縮數據,而且我們擁有多達16支球隊的聯賽。

這裏是我的javascript:

// make JSON call to Google Data API 
 
$.getJSON(url, function(data) { 
 

 
    //Build the Card Group 
 
    var cardstart = ''; 
 
    cardstart += '<div class="card-deck">'; 
 

 
    var cardend = ''; 
 
    cardend += '</div>'; 
 

 
    //Build the Sunday Juniors Rosters 
 
    var sunjunroster = ''; 
 

 
    //Loop to build the html output for team name 
 
    var entrysunjunroster = data.feed.entry; 
 
    for (var ia = 0; ia < entrysunjunroster.length; ia++) { 
 
    if (entrysunjunroster[ia]['gsx$night']['$t'] == "sunday" && entrysunjunroster[ia]['gsx$format']['$t'] == "juniors") { 
 
     sunjunroster += '<div class="card border border-dark mb-3">'; 
 
     sunjunroster += '<h4 class="card-header bg-bcaprimary text-light text-center">' + entrysunjunroster[ia]['gsx$teamname']['$t'] + '</h4>'; 
 
     sunjunroster += '<div class="card-body p-0">'; 
 
     sunjunroster += '<table class="table table-sm mb-0 tablesorter table-striped"><tbody>'; 
 
     if (entrysunjunroster[ia]['gsx$p1']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p1']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p2']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p2']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p3']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p3']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p4']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p4']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p5']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p5']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p6']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p6']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p7']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p7']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p8']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p8']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p9']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p9']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p10']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p10']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p11']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p11']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p12']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p12']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p13']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p13']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p14']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p14']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p15']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p15']['$t'] + '</td></tr>'; 
 
     } 
 
     if (entrysunjunroster[ia]['gsx$p16']['$t'] !== '') { 
 
     sunjunroster += '<tr><td class="text-center">' + entrysunjunroster[ia]['gsx$p16']['$t'] + '</td></tr>'; 
 
     } 
 
     sunjunroster += '</tbody></table></div></div>'; 
 
    } 
 
    } 
 

 
    // output html - Sunday Juniors 	 
 
    $('.sunjunroster').html(cardstart + sunjunroster + cardend); 
 

 
});

,並建立此我的網頁上的HTML:

<div class="container-fluid"> 
 
    <div class="row"> 
 
    <div class="col"> 
 
     <div class="sunjunroster"></div> 
 
    </div> 
 
    </div> 
 
</div>

我知道用PH P可以計算查詢中返回的項目並插入一行代碼,然後繼續查詢。這是我想在這裏做的。

它會在哪裏拿起計數,並在3個項目後,它關閉col和row div,並將它們添加回來以開始新行。

因此,這將插入此代碼:

</div></div><div class="row"><div class="col">

,然後繼續從JSON數組建設。

+0

我還在學習javascript/jquery,你能解釋我在哪裏添加這個嗎? 我想如果我看到你說的話,我應該用這樣的: 如果(VAR IA%3 == 0){ sunjunroster + ='

'; } –

沙发
0
0

使用模運算符%。它返回一個分區的其餘部分。可以被3除的整數的其餘部分總是0,所以我們可以利用這個優勢。

for (var ia = 0; ia < entrysunjunroster.length; ia++) { 
    if (ia % 3 == 0 && ia > 0) 
    { 
     sunjunroster += '</div></div><div class="row"><div class="col">'; 
    } 
    else if (ia == 0) //expection for zero index, nothing to close 
    { 
     sunjunroster += '<div class="row"><div class="col">'; 
    } 

    //rest of your code... 
} 
+0

我試過實現這一點,但它似乎返回第1行的1個項目,然後在第2個項目,並沒有關閉行後,但開始一個新的行,在同一個地方。 –

+0

的確,在我的腦海中想象這一點,使得看到屏幕上發生的事情變得更加困難,更新應該起作用。 – Mouser

+0

幾乎完美。我不得不刪除!在第二行的末尾讓它起作用。這裏演示:https://www.westmibcapl.com/leagues/ 點擊右上角的團隊名單,看看它的面板。 –

0
votes
answers
43 views
+10

人幫助我一下AJAX JSON

-1

我存儲在笨電腦板「迴應」,此數據:人幫助我一下AJAX JSON

{ 
    "ok": false, 
    "messages": { 
    "cgusrnm": "<p class="text-danger">The Full Name field is required.</p>", 
    "cgnnm": "<p class="text-danger">The Nick Name field is required.</p>", 
    "cgeml": "<p class="text-danger">The Email Address field is required.</p>", 
    "cgunm": "<p class="text-danger">The User Name field is required.</p>", 
    "cgpsd": "<p class="text-danger">The Password field is required.</p>", 
    "ccgpsd": "<p class="text-danger">The Confirm Password field is required.</p>", 
    "cgcnm": "<p class="text-danger">The Company Name field is required.</p>", 
    "cgadr": "<p class="text-danger">The User Address field is required.</p>", 
    "cgct": "<p class="text-danger">The City field is required.</p>", 
    "cgcnt": "<p class="text-danger">The Country field is required.</p>", 
    "cgzn": "<p class="text-danger">The State field is required.</p>", 
    "cgzc": "<p class="text-danger">The Zip Code field is required.</p>", 
    "cgpn": "<p class="text-danger">The Phone Number field is required.</p>", 
    "cgsn": "<p class="text-danger">The Skype Name field is required.</p>", 
    "pm": "<p class="text-danger">The Payment Method field is required.</p>", 
    "cgpeml": "<p class="text-danger">The Email Address field is required.</p>" 
    } 
} 

但AJAX文件無法讀取該陣列。

我的Ajax代碼:

$('#form_user').submit(function(e) { 
    e.preventDefault(); 

    var me = $(this); 

    $.ajax({ 
    url: me.attr('action'), 
    type: 'post', 
    data: me.serialize(), 
    datatype: 'json', 
    success: function(response) { 
     if (response.ok == true) { 
     alert('response'); 
     } else { 
     $.each(response.messages, function(key, value) { 
      var element = $('#' + key); 
      element.after(value); 
     }); 
     } 
    } 
    }); 
}); 

請幫助我。

+0

它可能是'response.data.ok'。 'console.log'取出'response'的值並調查它的結構。 – ceejayoz

+0

我在本教程中流動https://youtu.be/H1sHOvc8au0 – Abdullah

+0

我沒有看YouTube教程來回答這個問題。使用'console.log'來查看'response'的值是什麼。相應地調整代碼。 – ceejayoz

沙发
0
0

消息不是數組而是對象。 JSON數組看起來像{message:[「a」,「b」]}

+0

以便我如何正確完成我的工作 – Abdullah

+0

爲什麼無法工作我的代碼?我流這個教程https://youtu.be/H1sHOvc8au0 – Abdullah

板凳
0
1

即使數據類型是json,response變量的類型仍然是字符串。嘗試添加response = JSON.parse(response);將字符串轉換爲JavaScript對象。

+0

非常感謝你。 – Abdullah

+0

原因是你稱它爲'datatype'而不是'dataType'。 'datatype'不做任何事情。您可以擺脫'JSON.parse'並將其更改爲'dataType'。 –

+0

謝謝大衛,我想知道爲什麼它不起作用。我很困惑... –

0
votes
answers
54 views
+10

如何得到一個JSON結果/響應查看

0

我一直在試圖從我的控制器得到我的看法的響應,但我得到的只是純JSOn顯示(Firefox:圖像附加)或提示爲JSON文件下載。我嘗試了很多方法。請有人給我看看或給我的代碼,以便我可以在視圖上至少獲得成功,並可以顯示至少enter image description here的警報。如何得到一個JSON結果/響應查看

public JsonResult GetGata() 
    { 
     List<ProdVM > pvl = new List<ProdVM>(); 
     try 
     { 
      ProdVM pvm1 = new ProdVM(); 
      pvm1.ProductID = 1; 
      pvm1.ProductName = "Computer"; 
      pvl.Add(pvm1); 
      return Json(pvl, JsonRequestBehavior.AllowGet); 
      } 

     catch (Exception) 
     { 
      throw; 
     } 
    } 
$(document).ready(function() { 
$(document).ready(function() { 
    $('#myGrid').DataTable({ 
     "ajax": { 
      "url": "/Home/GetGata/", 
      "dataSrc": "" 
     }, 
     "columns": [ 
     { "data": "ProductName" }, 
     { "data": "ProductID" } 
     ] 
    }); 
}); 

});

沙发
0
0

數據表插件期望AJAX端點以這種格式

{"data":[["1","Computer"],["2","Camera"]]} 

可以看到,返回數據,每個項是一個數組(一個字符串數組,其中每個串產品屬性值)

這應該工作

public ActionResult GetData() 
{ 
    var items = new List<string[]> 
    { 
     new string[] {"1", "Computer"}, 
     new string[] {"2", "Camera"} 
    }; 
    return Json(new { data = items }, JsonRequestBehavior.AllowGet); 
} 

這應該工作假設你有一個這樣的表在頁面

<table id="example" class="display" cellspacing="0" width="100%"> 
    <thead> 
     <tr> 
      <th>Id</th> 
      <th>Name</th> 
     </tr> 
    </thead> 
</table> 

和JS代碼來調用端點獲得數據,並使用了數據表

$(function() { 
    $('#example').DataTable({ 
     "ajax": "@Url.Action("GetData")" 
    }); 
}); 
+0

謝謝您的回答。但是,我仍然遇到類似頁面的錯誤。 firefox只顯示json值和IE提示JSon下載。請有人幫助我。我被困在這裏,無法練習或學習任何關於來自.net控制器的json響應,我在成功獲得響應並在html上顯示。請有人看到這種情況,請幫助我。 –

+0

當您運行該頁面時,您將收到警告?如果您嘗試直接訪問端點,則可能會根據瀏覽器設置獲取錯誤。試着用postman/fiddler/advanced rest client chrome插件來訪問端點 – Shyju

+0

我可以在郵差中得到Json結果。但我需要在.cshtml(查看文件)。我通過本地訪問URL。爲了學習目的,我需要爲開發模式開發所有樣本。你能否給我一個Hello world類型的例子,你可以在你的Visual Studio的本地主機上看到,其中reponse來自控制器的JsonResult返回類型,並且你的jquer的成功可以在alert中捕獲它? –