GVKun编程网logo

从 json 文件中过滤掉区域(json数据过滤)

11

此处将为大家介绍关于从json文件中过滤掉区域的详细内容,并且为您解答有关json数据过滤的相关问题,此外,我们还将为您介绍关于19.JAVA-从文件中解析json、并写入Json文件(详解)、c#–

此处将为大家介绍关于从 json 文件中过滤掉区域的详细内容,并且为您解答有关json数据过滤的相关问题,此外,我们还将为您介绍关于19.JAVA-从文件中解析json、并写入Json文件(详解)、c# – 在过滤掉某些属性时序列化JSON.NET JObject、fastjson 过滤掉不需要序列化的属性、fastjson转json的时候过滤掉某些属性的有用信息。

本文目录一览:

从 json 文件中过滤掉区域(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)

解决方法

你有一些错别字。此外,您需要将 lnglat 放在数据框中,以便每个选择都有自己的坐标。目前,您将其定义为 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文件(详解)

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

c# – 在过滤掉某些属性时序列化JSON.NET JObject

我的代码中有一个大的任意 JSON结构作为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);
}

解决方法

需要构建转换器来处理JToken,它必须递归工作以确保编辑所有加密数据.

我能够使用以下转换器:

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 过滤掉不需要序列化的属性

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的时候过滤掉某些属性

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的时候过滤掉某些属性的相关知识,请在本站进行查询。

本文标签: