此处将为大家介绍关于从json文件中过滤掉区域的详细内容,并且为您解答有关json数据过滤的相关问题,此外,我们还将为您介绍关于19.JAVA-从文件中解析json、并写入Json文件(详解)、c#–
此处将为大家介绍关于从 json 文件中过滤掉区域的详细内容,并且为您解答有关json数据过滤的相关问题,此外,我们还将为您介绍关于19.JAVA-从文件中解析json、并写入Json文件(详解)、c# – 在过滤掉某些属性时序列化JSON.NET JObject、fastjson 过滤掉不需要序列化的属性、fastjson转json的时候过滤掉某些属性的有用信息。
本文目录一览:- 从 json 文件中过滤掉区域(json数据过滤)
- 19.JAVA-从文件中解析json、并写入Json文件(详解)
- c# – 在过滤掉某些属性时序列化JSON.NET JObject
- fastjson 过滤掉不需要序列化的属性
- fastjson转json的时候过滤掉某些属性
从 json 文件中过滤掉区域(json数据过滤)
如何解决从 json 文件中过滤掉区域?
我是 R Shiny 的新手,我正在尝试在我的应用中添加一个功能,我可以在其中选择城市内社区的下拉菜单。默认选择是整个城市本身 SURREY
。预计当我从 SURREY
以外的下拉菜单中选择一个街区时,我希望它过滤掉其他街区,因此只显示所选街区的轮廓。但是,当我尝试这样做时,我的地图会完全停止渲染。 JSON 文件是 here,我提取了它并将其放在我的相对 data
路径中。我的完整代码如下:
library(shiny)
library(shinydashboard)
library(shinyjs)
library(leaflet)
library(leaflet.extras)
library(sf)
library(ggplot2)
library(dplyr)
library(lubridate)
library(rgdal)
##constants
SURREY_LAT <- 49.15
SURREY_LNG <- -122.8
ZOOM_MIN = 10
ZOOM_MAX = 18
##
neighbourhood <- st_read("data/surrey_city_boundary.json",quiet = TRUE) %>%
st_transform(crs = 4326)%>%
select(NAME,geometry)
neighbourhood_names <- neighbourhood$NAME %>%
as.character(.) %>%
sort()
##basemap
basemap<-leaflet() %>%
addProviderTiles(providers$CartoDB.Positron)%>%
setView(lng = SURREY_LNG,lat =SURREY_LAT,zoom= 10)
ui <- bootstrapPage(
tags$style(type = "text/css","html,body {width:100%;height:100%}"),leafletoutput("basemap",width = "100%",height = "100%"),absolutePanel(id = "controls",,top = 60,left = 55,width = 250,fixed = TRUE,draggable = TRUE,height = "auto",selectInput(
"neighbourhood_names",label = "Select a Neighbourhood:",choices=(neighbourhood_names),selected= "SURREY")
)
)
#server
server <- function(input,output) {
output$mymap <- renderLeaflet(basemap)
observeEvent(input$neighbourhood_names,{
if(input$neighbourhood_names =="SURREY"){
data<- neighbourhood %>%
filter(NAME %in% c("CITY CENTRE","ClovERDale","FLEETWOOD","GUILDFORD","NEWTON","SOUTH SURREY","WHALLEY"))}
else{
data <- neighbourhood %>%
filter(NAME == input$neighbourhood_names)}
leafletProxy("mymap",data= neighbourhood) %>%
setView(lng = ifelse(input$neighbourhood_names == "Surrey",-122.7953,49.15),lat = ifelse(input$neighbourhood_names == "Surrey",49.10714,zoom = ifelse(input$neighbourhood_names == "Surrey",11,12)) %>%
clearShapes() %>%
addpolygons(color = "#141722",weight = 3,smoothFactor = 0.5,fillOpacity = 0.1,opacity = 1)
})
}
shinyApp(ui = ui,server = server)
解决方法
你有一些错别字。此外,您需要将 lng
和 lat
放在数据框中,以便每个选择都有自己的坐标。目前,您将其定义为 setView
中的 49.15。修复数据框后,这应该可以工作。
SURREY_LAT <- 49.15
SURREY_LNG <- -122.8
ZOOM_MIN = 10
ZOOM_MAX = 18
##
neighbourhood <- st_read("./surrey_city_boundary.json",quiet = TRUE) %>%
st_transform(crs = 4326) %>%
select(NAME,geometry)
neighbourhood_names <- neighbourhood$NAME %>%
as.character(.) %>%
sort()
##basemap
basemap<-leaflet() %>%
addProviderTiles(providers$CartoDB.Positron)%>%
setView(lng = SURREY_LNG,lat =SURREY_LAT,zoom= 10)
ui <- bootstrapPage(
tags$style(type = "text/css","html,body {width:100%;height:100%}"),leafletOutput("mymap",width = "100%",height = "100%"),absolutePanel(id = "controls",,top = 60,left = 55,width = 250,fixed = TRUE,draggable = FALSE,height = "auto",shiny::selectInput(
"neighbourhood_names",label = "Select a Neighbourhood:",choices=(neighbourhood_names),selected= "SURREY"
)
)
)
#server
server <- function(input,output) {
output$mymap <- renderLeaflet(basemap)
observeEvent(input$neighbourhood_names,{
req(input$neighbourhood_names)
if(input$neighbourhood_names =="SURREY"){
data<- neighbourhood %>%
dplyr::filter(NAME %in% c("CITY CENTRE","CLOVERDALE","FLEETWOOD","GUILDFORD","NEWTON","SOUTH SURREY","WHALLEY"))
} else{
data <- neighbourhood %>%
dplyr::filter(NAME == input$neighbourhood_names)}
leafletProxy("mymap",data= data) %>%
setView(lng = ifelse(input$neighbourhood_names == "SURREY",-122.7953,49.15),lat = ifelse(input$neighbourhood_names == "SURREY",49.10714,zoom = ifelse(input$neighbourhood_names == "SURREY",11,12)) %>%
clearShapes() %>%
addPolygons(color = "#141722",weight = 3,smoothFactor = 0.5,fillOpacity = 0.1,opacity = 1)
})
}
shinyApp(ui = ui,server = server)
19.JAVA-从文件中解析json、并写入Json文件(详解)
1.json介绍
json与xml相比, 对数据的描述性比XML较差,但是数据体积小,传递速度更快.
json数据的书写格式是"名称:值对",比如:
"Name" : "John" //name为名称,值对为"john"字符串
值对类型共分为:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号[]中)
- 对象(在花括号{}中)
- null
当然数组也可以包含多对象:
{
"employees": [
{ "Name":"John" , "Age":19 },
{ "Name":"Anna" , "Age":22 },
{ "Name":"Peter", "Age":23 }
]
}
表示"employees"对象中有3个对象数组(每个对象数组表示一条员工信息),其中并列的数据都必须用逗号","隔开.
2.json包使用
在www.json.org上公布了很多JAVA下的json解析工具(还有C/C++等等相关的),其中org.json和json-lib比较简单,两者使用上差不多,这里我们使用org.json,org.json下载地址为: https://search.maven.org/search?q=g:org.json%20AND%20a:json&core=gav
3.json解析
3.1解析步骤
- 首先通过new JSONObject(String)来构造一个json对象,并将json字符串传递进来.
- 然后通过getXXX(String key)方法去获取对应的值.
3.2 example.json示例文件如下:
{
"FLAG": 1,
"NAME": "example",
"ARRAYS":
[
{
"Name": "array1",
"String": "哈哈哒1"
},
{
"Name": "array2",
"String": "哈哈哒2"
},
{
"Name": "array3",
"String": "哈哈哒3"
},
{
"Name": "array4",
"String": "哈哈哒4"
}
]
}
3.3解析代码如下:
@Test
public void JsonParser() throws Exception{
char cbuf[] = new char[10000];
InputStreamReader input =new InputStreamReader(new FileInputStream(new File("src//example.json")),"UTF-8");
int len =input.read(cbuf);
String text =new String(cbuf,0,len);
//1.构造一个json对象
JSONObject obj = new JSONObject(text.substring(text.indexOf("{"))); //过滤读出的utf-8前三个标签字节,从{开始读取
//2.通过getXXX(String key)方法获取对应的值
System.out.println("FLAG:"+obj.getString("FLAG"));
System.out.println("NAME:"+obj.getString("NAME"));
//获取数组
JSONArray arr = obj.getJSONArray("ARRAYS");
System.out.println("数组长度:"+arr.length());
for(int i=0;i<arr.length();i++)
{
JSONObject subObj = arr.getJSONObject(i);
System.out.println("数组Name:"+subObj.getString("Name")+" String:"+subObj.getString("String"));
}
}
打印如下:
4.写json文件
4.1写json步骤
- 首先通过new JSONObject()来构造一个空的json对象
- 如果要写单对象内容,则通过JSONObject .put(key,value)来写入
- 如果要写多数组对象内容,则通过JSONObject .accumulate (key,value)来写入
- 最后通过JSONObject .toString()把数据导入到文件中.
4.2写示例如下:
@Test
public void JsonWrite() throws Exception{
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("exampleWrite.json"),"UTF-8");
JSONObject obj=new JSONObject();//创建JSONObject对象
obj.put("FLAG","1");for(Integer i=1;i<4;i++)
{
JSONObject subObj=new JSONObject();//创建对象数组里的子对象
subObj.put("Name","array"+i);
subObj.put("String","小白"+i);
obj.accumulate("ARRAYS",subObj);
}
System.out.println(obj.toString());
osw.write(obj.toString());
osw.flush();//清空缓冲区,强制输出数据
osw.close();//关闭输出流
}
打印如下:
原文出处:https://www.cnblogs.com/lifexy/p/12030880.html
c# – 在过滤掉某些属性时序列化JSON.NET JObject
我想序列化这个结构,除非我遇到一个包含一个名为type的属性的JObject,其值为“encrypted”,然后我想在写入对象之前删除相邻的data属性.
换句话说,如果我遇到这个:
{ type: "encrypted",name: "some-name",data: "<base64-string>" }
它将被序列化为:
{ type: "encrypted",name: "some-name" }
我不能改变结构,在变异之前克隆它会效率太低,所以我尝试使用JsonConverter如下:
public class RemoveEncryptedDataSerializer : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(JObject); } public override object ReadJson(JsonReader reader,Type objectType,object existingValue,JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer) { var o = (JObject)value; if (o.Value<string>("type") != "encrypted") { o.Writeto(writer); return; } var copy = o.DeepClone(); copy["data"]?.Parent.Remove(); copy.Writeto(writer); } }
但是,CanConvert函数似乎只是使用不是从JToken派生的类型调用,所以我的WriteJson函数永远不会被调用.
还有另一种方法来实现这一目标吗?
编辑:以下是一些可用于测试的代码:
[TestMethod] public void ItShouldExcludeEncryptedData() { var input = JObject.Parse(@" { a: { type: 'encrypted',name: 'some-name',data: 'some-data' } }"); var expected = JObject.Parse(@" { a: { type: 'encrypted',} }"); var output = input.ToString(Formatting.Indented,new RemoveEncryptedDataSerializer()); Assert.AreEqual( expected.ToString(Formatting.Indented),output); }
解决方法
我能够使用以下转换器:
public class RemoveEncryptedDataConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(JToken).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader,JsonSerializer serializer) { JToken token = (JToken)value; if (token.Type == JTokenType.Object) { bool omitDataProperty = token.Value<string>("type") == "encrypted"; writer.WriteStartObject(); foreach (var prop in token.Children<JProperty>()) { if (omitDataProperty && prop.Name == "data") continue; writer.WritePropertyName(prop.Name); serializer.Serialize(writer,prop.Value); // recurse } writer.WriteEndobject(); } else if (token.Type == JTokenType.Array) { writer.WriteStartArray(); foreach (var item in token.Children()) { serializer.Serialize(writer,item); // recurse } writer.WriteEndarray(); } else // JValue { token.Writeto(writer); } } }
工作演示:https://dotnetfiddle.net/0K61Bz
如果要直接通过流使用JsonWriter,可以将转换器中的逻辑重构为递归扩展方法并使用它.如果您不使用序列化程序,则不需要转换器.
public static class JsonExtensions { public static void RedactedWriteto(this JToken token,JsonWriter writer) { if (token.Type == JTokenType.Object) { bool omitDataProperty = token.Value<string>("type") == "encrypted"; writer.WriteStartObject(); foreach (var prop in token.Children<JProperty>()) { if (omitDataProperty && prop.Name == "data") continue; writer.WritePropertyName(prop.Name); prop.Value.RedactedWriteto(writer); // recurse } writer.WriteEndobject(); } else if (token.Type == JTokenType.Array) { writer.WriteStartArray(); foreach (var item in token.Children()) { item.RedactedWriteto(writer); // recurse } writer.WriteEndarray(); } else // JValue { token.Writeto(writer); } } }
然后你就可以像这样使用它,其中stream是你的输出流,输入是你的JObject:
using (StreamWriter sw = new StreamWriter(stream)) // or StringWriter if you prefer using (JsonWriter writer = new JsonTextWriter(sw)) { writer.Formatting = Formatting.Indented; input.RedactedWriteto(writer); }
小提琴:https://dotnetfiddle.net/l949HU
fastjson 过滤掉不需要序列化的属性
第一种方式,使用PropertyFilter。
可根据属性名称或属性值进行过滤。
PropertyFilter filter = new PropertyFilter() { // name:属性名称,value:属性值 public boolean apply(Object source,String name,Object value) { // 当属性名称是“name”且属性值是“chennp2008”时,将其过滤出来 if ("name".equals(name) && "chennp2008".equals(value)) { // true 需要序列化,过滤出来 return true; } // false 无需序列化,不过滤出来 return false; } }; SerializeWriter out = new SerializeWriter(); JSONSerializer serializer = new JSONSerializer(out); serializer.getPropertyFilters().add(filter); A a = new A(); a.setName("chennp2008"); serializer.write(a); String text = out.toString(); Assert.assertEquals("{\"name\":\"chennp2008\"}",text);实体类Entity
public class A { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
第二种方式,使用SimplePropertyPreFilter。
根据属性名称过滤。
VO vo = new VO(); vo.setId(123); vo.setName("flym"); // SimplePropertyPreFilter第二个参数:传入需要序列化属性的名称 SimplePropertyPreFilter filter = new SimplePropertyPreFilter(VO.class,"name"); // 只序列化name,不序列化id Assert.assertEquals("{\"name\":\"flym\"}",JSON.toJSONString(vo,filter));实体类Entity
class VO { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
fastjson转json的时候过滤掉某些属性
@JSONType(orders = { "prop1","prop2","prop3","prop4" })
@Data
public class AppResourceModel implements ParserModel {
private String prop1;
private String prop2;
private String prop3;
private List<String> prop4;
@Override
public String toJson() {
if (StringUtil.isBlank(prop1) && StringUtil.isBlank(prop2) && StringUtil.isBlank(prop3)) {
return null;
}
return JSON.toJSONString(this);
}
/*
* @return 添加json格式过滤,防止这个在转json的时候自动添加到json中
* 通过这种方法来过滤掉不需要的属性
*/
@Override
@JSONField(serialize = false) public int getSelect() { return 0; }}
今天的关于从 json 文件中过滤掉区域和json数据过滤的分享已经结束,谢谢您的关注,如果想了解更多关于19.JAVA-从文件中解析json、并写入Json文件(详解)、c# – 在过滤掉某些属性时序列化JSON.NET JObject、fastjson 过滤掉不需要序列化的属性、fastjson转json的时候过滤掉某些属性的相关知识,请在本站进行查询。
本文标签: