Git Product home page Git Product logo

fastjson2's Introduction

Java CI Codecov Maven Central GitHub release Java support License Gitpod Ready-to-Code Last SNAPSHOT GitHub Stars GitHub Forks user repos GitHub Contributors

📖 English Documentation | 📖 中文文档
本项目的Issues会被同步沉淀至阿里云开发者社区

FASTJSON v2

FASTJSON 2是一个性能极致并且简单易用的Java JSON库。

fastjson logo

1. 使用准备

1.1 添加依赖

fastjson v2中,groupId1.x不一样,是com.alibaba.fastjson2

Maven:

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.49</version>
</dependency>

Gradle:

dependencies {
    implementation 'com.alibaba.fastjson2:fastjson2:2.0.49'
}

可以在 maven.org 查看最新可用的版本。

1.2 其他模块

Fastjson v1兼容模块

如果原来使用fastjson 1.2.x版本,可以使用兼容包,兼容包不能保证100%兼容,请仔细测试验证,发现问题请及时反馈。

Maven:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.49</version>
</dependency>

Gradle:

dependencies {
    implementation 'com.alibaba:fastjson:2.0.49'
}

Fastjson Kotlin集成模块

如果项目使用Kotlin,可以使用fastjson-kotlin模块,使用方式上采用kotlin的特性。

  • Maven:
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2-kotlin</artifactId>
    <version>2.0.49</version>
</dependency>

酌情添加标准库(kotlin-stdlib)、反射库(kotlin-reflect), 其中若使用数据类(data class)、通过构造函数传入参数则添加反射库。

<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-stdlib</artifactId>
    <version>${kotlin-version}</version>
</dependency>

<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-reflect</artifactId>
    <version>${kotlin-version}</version>
</dependency>
  • Kotlin Gradle:
dependencies {
    implementation("com.alibaba.fastjson2:fastjson2-kotlin:2.0.49")
}
dependencies {
    implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version")
    implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlin_version")
}

Fastjson Extension扩展模块

如果项目使用SpringFramework等框架,可以使用fastjson-extension模块,使用方式参考 SpringFramework Support

Maven:

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2-extension-spring5</artifactId>
    <version>2.0.49</version>
</dependency>
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2-extension-spring6</artifactId>
    <version>2.0.49</version>
</dependency>

Gradle:

dependencies {
    implementation 'com.alibaba.fastjson2:fastjson2-extension-spring5:2.0.49'
}
dependencies {
    implementation 'com.alibaba.fastjson2:fastjson2-extension-spring6:2.0.49'
}

2. 简单使用

fastjson v2中,package1.x不一样,是com.alibaba.fastjson2。如果你之前用的是fastjson1,大多数情况直接更包名就即可。

2.1 将JSON解析为JSONObject

Java:

String text = "...";
JSONObject data = JSON.parseObject(text);

byte[] bytes = ...;
JSONObject data = JSON.parseObject(bytes);

Kotlin:

import com.alibaba.fastjson2.*

val text = ... // String
val data = text.parseObject()

val bytes = ... // ByteArray
val data = bytes.parseObject() // JSONObject

2.2 将JSON解析为JSONArray

Java:

String text = "...";
JSONArray data = JSON.parseArray(text);

Kotlin:

import com.alibaba.fastjson2.*

val text = ... // String
val data = text.parseArray() // JSONArray

2.3 将JSON解析为Java对象

Java:

String text = "...";
User data = JSON.parseObject(text, User.class);

Kotlin:

import com.alibaba.fastjson2.*

val text = ... // String
val data = text.to<User>() // User
val data = text.parseObject<User>() // User

2.4 将Java对象序列化为JSON

Java:

Object data = "...";
String text = JSON.toJSONString(data);
byte[] text = JSON.toJSONBytes(data);

Kotlin:

import com.alibaba.fastjson2.*

val data = ... // Any
val text = text.toJSONString() // String
val bytes = text.toJSONByteArray() // ByteArray

2.5 使用JSONObjectJSONArray

2.5.1 获取简单属性

String text = "{\"id\": 2,\"name\": \"fastjson2\"}";
JSONObject obj = JSON.parseObject(text);

int id = obj.getIntValue("id");
String name = obj.getString("name");
String text = "[2, \"fastjson2\"]";
JSONArray array = JSON.parseArray(text);

int id = array.getIntValue(0);
String name = array.getString(1);

2.5.2 读取JavaBean

Java:

JSONArray array = ...
JSONObject obj = ...

User user = array.getObject(0, User.class);
User user = obj.getObject("key", User.class);

Kotlin:

val array = ... // JSONArray
val obj = ... // JSONObject

val user = array.to<User>(0)
val user = obj.to<User>("key")

2.5.3 转为JavaBean

Java:

JSONArray array = ...
JSONObject obj = ...

User user = obj.toJavaObject(User.class);
List<User> users = array.toJavaList(User.class);

Kotlin:

val array = ... // JSONArray
val obj = ... // JSONObject

val user = obj.to<User>() // User
val users = array.toList<User>() // List<User>

2.6 将JavaBean对象序列化为JSON

Java:

class User {
    public int id;
    public String name;
}

User user = new User();
user.id = 2;
user.name = "FastJson2";

String text = JSON.toJSONString(user);
byte[] bytes = JSON.toJSONBytes(user);

Kotlin:

class User(
    var id: Int,
    var name: String
)

val user = User()
user.id = 2
user.name = "FastJson2"

val text = user.toJSONString() // String
val bytes = user.toJSONByteArray() // ByteArray

序列化结果:

{
    "id"   : 2,
    "name" : "FastJson2"
}

3. 进阶使用

3.1 使用JSONB

3.1.1 将JavaBean对象序列化JSONB

User user = ...;
byte[] bytes = JSONB.toBytes(user);
byte[] bytes = JSONB.toBytes(user, JSONWriter.Feature.BeanToArray);

3.1.2 将JSONB数据解析为JavaBean

byte[] bytes = ...
User user = JSONB.parseObject(bytes, User.class);
User user = JSONB.parseObject(bytes, User.class, JSONReader.Feature.SupportBeanArrayMapping);

3.2 使用JSONPath

3.2.1 使用JSONPath读取部分数据

String text = ...;
JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能

JSONReader parser = JSONReader.of(text);
Object result = path.extract(parser);

3.2.2 使用JSONPath读取部分byte[]的数据

byte[] bytes = ...;
JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能

JSONReader parser = JSONReader.of(bytes);
Object result = path.extract(parser);

3.2.3 使用JSONPath读取部分byte[]的数据

byte[] bytes = ...;
JSONPath path = JSONPath.of("$.id"); // 缓存起来重复使用能提升性能

JSONReader parser = JSONReader.ofJSONB(bytes); // 注意这里使用ofJSONB方法
Object result = path.extract(parser);

Star History

Star History Chart

fastjson2's People

Contributors

a1batr0ss avatar bodhili avatar cnscoo avatar codeplayer avatar danght avatar dependabot[bot] avatar gabrielhwang avatar howardlei avatar jiangqiang1996 avatar kdl1217 avatar kraity avatar krishnanand5 avatar lhaox avatar liaozan avatar magicfollower avatar mek1986 avatar moshicoco avatar oldratlee avatar rowstop avatar scrollsyou avatar seasonpanpan avatar shenfeng312 avatar victorzeng avatar wenshao avatar wsxe9988 avatar wyyl1 avatar xiezheng-xd avatar yanxutao89 avatar yinwoods avatar zhao2018mr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fastjson2's Issues

two typos in README.md

将Java对象输出成UT8编码的byte[]

构造基于ut8编码byte数组输入的JSONReader

应该是UTF-8?

Fastjson2生成json串字段顺序问题

在使用fastjson2 [2.0.1]时我注意到子类和父类同时使用注解@JSONField(ordinal=xxx)时,ObjectWriterCreatorASM类中fieldWriters读取父类ordinal值有误[232行],导致json串字段顺序非预期输出,在fastjson1中使用@jsontype(orders={})时,无此问题。

简单了尝试了几个常用方法,发现都已经不兼容了~

JSONObject.parseObject(var),这个方法被移除了,需要指定一个转换类型,改为:JSONObject.parseObject(var,JSONObject.class)
JSONArray 同样的道理;查看源码发现这2个都已经不在继承JSON 类,这样划分的更清晰了,但是如果是老项目的话,估计就有很多混用的需要修改了;

还发现一个问题,toJavaObject() 这个方法虽然还在,但是实现方式不一样了,经过简单的测试,发现不能直接转换成Map.class;
String str = "{"test":"123465"}";
JSONObject json = JSON.parseObject(str);
System.out.println(json.toJavaObject(Map.class)); // 结果为空!
System.out.println(JSON.toJavaObject(json, Map.class)); // 结果为空!
System.out.println(JSON.toJavaObject(str, Map.class)); // 内容正确!
想要升级的,估计得好好思考一下了~

How is FastJson2 integrated in Springboot?

In the FastJson1.X version, I added FastJson to the SpringIOC container by configuring the following beans.

@Bean
public HttpMessageConverters fadtJsonHttpMessageConverters(){
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
    FastJsonConfig fastJsonConfig = new FastJsonConfig();
    fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
    fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
    HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
    return new HttpMessageConverters(converter);
}

But it seems to be no longer available in FastJson2. Is there any good way?

字符串反序列化时出现bug

反序列化时,对字符串中的反斜杠 \ 判定为后一个字符的转义,从而反序列化出错
测试代码如下

char a = 0x5c;
HashMap<Object, Object> hashMap = new HashMap<>();
hashMap.put("1",a);

String string = JSON.toJSONString(hashMap);
System.out.println(string);
JSON.parse(string);

输出结果和报错信息如下

{"1":"\"}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
	at com.alibaba.fastjson2.JSONReaderUTF16.readString(JSONReaderUTF16.java:1211)
	at com.alibaba.fastjson2.reader.ObjectReaderImplMap.readObject(ObjectReaderImplMap.java:390)
	at com.alibaba.fastjson2.reader.ObjectReaderImplObject.readObject(ObjectReaderImplObject.java:21)
	at com.alibaba.fastjson2.JSON.parse(JSON.java:22)
	at com.bitterz.test.main(test.java:35)

hashmap中放入其它键值对时报错不同

ArrayList<Object> list = new ArrayList<>();
list.add("123");
list.add("123");
char a = 0x5c;
HashMap<Object, Object> hashMap = new HashMap<>();
hashMap.put("1",a);
hashMap.put(list, 1);

String string = JSON.toJSONString(hashMap);
System.out.println(string);
JSON.parse(string);

输出结果和报错内容如下

{"1":"\","[123, 123]":1}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 24
	at com.alibaba.fastjson2.JSONReaderUTF16.readFieldName(JSONReaderUTF16.java:510)
	at com.alibaba.fastjson2.reader.ObjectReaderImplMap.readObject(ObjectReaderImplMap.java:352)
	at com.alibaba.fastjson2.reader.ObjectReaderImplObject.readObject(ObjectReaderImplObject.java:21)
	at com.alibaba.fastjson2.JSON.parse(JSON.java:22)
	at com.bitterz.test.main(test.java:25)

感觉有点过了

JSON本应是轻量级的数据交换格式,一个解析库有1700+文件,17w 行代码,已经偏离初衷,为了库的存在而写,代码冗余度实在...

fastjson1_compatible 的maven group错误

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson-parent</artifactId>
<version>2.0.2_preview01</version>
</parent>
<artifactId>fastjson</artifactId>
<packaging>jar</packaging>
<name>fastjson1-compatible</name>
<description>Fastjson is a JSON processor (JSON parser + JSON generator) written in Java</description>

是否应该添加
<groupId>com.alibaba</groupId>

jsonPath.extract解析不对

String str = "{"id":123,"姓名":{"location":{"top":277,"left":618,"width":372,"height":164},"words":"张三"},"log_id":1453528763137919643}";

JSONPath jsonPath = JSONPath.of("log_id");
JSONReader parser = JSONReader.of(str);
System.out.println(jsonPath.extract(parser));

为什么获取到的结果是{"location":{"top":277,"left":618,"width":372,"height":164},"words":"张三"},而不是1453528763137919643

愿景

protobuf被工业物联网广泛使用, 除了其效率高以外还有一个最重要的点就是其生成对象后体积小, fastjson2也能提供这种体积小的方法?

请教反序列化包含泛型的问题

Result result = JSON.parseObject(str, new TypeReference<Result>(){});

2.x 中这么使用反序列化(包含泛型)时 IDEA 提示下面的错误,请教 2.x 如何处理这块 ?感谢!

无法解析方法'parseObject(java.lang.String, anonymous com.alibaba.fastjson2.TypeReference<com.william.mall.common.model.Result<com.william.mall.common.model.TestUser>>)'

number too large

com.alibaba.fastjson2.JSONException: number too large : 0.784018486000000000000000000000000000000 at com.alibaba.fastjson2.JSONReader.bigInt(JSONReader.java:1620) at com.alibaba.fastjson2.JSONReaderUTF16.readNumber0(JSONReaderUTF16.java:1527) at com.alibaba.fastjson2.JSONReader.readNumber(JSONReader.java:605) at com.alibaba.fastjson2.reader.ObjectReaderImplMap.readObject(ObjectReaderImplMap.java:380) at com.alibaba.fastjson2.JSON.parseObject(JSON.java:108)

{"a":0.784018486000000000000000000000000000000}

JUnit4升级到JUnit5

目前还有很多兼容JUnit4的代码,用Vintage的方式来跑,需要修改升级.

  1. 需要将所有的SpringJUnit4ClassRunner升级到junit5

graalvm支持

陈立兵(雷卷)反馈:

使用 jbang --verbose --native Hello.java 测试发现fastjson2报错。

///usr/bin/env jbang "$0" "$@" ; exit $?
//JAVA 17
//DEPS io.goodforgod:graalvm-hint-processor:0.18.1
//DEPS io.goodforgod:graalvm-hint-annotations:0.18.1
//DEPS com.alibaba.fastjson2:fastjson2:2.0.1

import com.alibaba.fastjson2.JSON;
import io.goodforgod.graalvm.hint.annotation.NativeImageHint;
import io.goodforgod.graalvm.hint.annotation.ReflectionHint;

@NativeImageHint(optionNames = {"--report-unsupported-elements-at-runtime"})
public class Hello {
    public static void main(String... args) throws Exception {
        User user = new User(1, "leijuan");
        // fastjson 2.0
        String jsonText = JSON.toJSONString(user);
        User user2 = JSON.parseObject(jsonText, User.class);
        System.out.println("Fastjson: " + user2.getNick());
    }
}

@ReflectionHint
class User {
    private Integer id;
    private String nick;

    public User() {
    }

    public User(Integer id, String nick) {
        this.id = id;
        this.nick = nick;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNick() {
        return nick;
    }

    public void setNick(String nick) {
        this.nick = nick;
    }
}

Fastjson2生成json串字段顺序问题

fastjson2 [2.0.1]当子类和父类同时使用注解@JSONField(ordinal=xxx)时,json串字段顺序非预期输出,在fastjson1中无此问题。
此bug经验证未解决(#9

testcase:

package tmp;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.annotation.JSONField;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Main {

    @Test
    public void test() {
        Son w = new Son();
        w.setUuid("11");
        w.setOrderNum(12);
        w.setDeptCode(23);
        w.setTotalNum(24);

        assertEquals("{\"uuid\":\"11\",\"orderNum\":12,\"deptCode\":23,\"totalNum\":24}",
                com.alibaba.fastjson.JSON.toJSONString(w));
        //failed
        assertEquals("{\"uuid\":\"11\",\"orderNum\":12,\"deptCode\":23,\"totalNum\":24}",
                JSON.toJSONString(w));

    }

    class Parent {

        @com.alibaba.fastjson.annotation.JSONField(ordinal = 1)
        @JSONField(ordinal = 1)
        private String uuid;

        @com.alibaba.fastjson.annotation.JSONField(ordinal = 2)
        @JSONField(ordinal = 2)
        private Integer orderNum;

        public String getUuid() {
            return uuid;
        }

        public void setUuid(String uuid) {
            this.uuid = uuid;
        }

        public Integer getOrderNum() {
            return orderNum;
        }

        public void setOrderNum(Integer orderNum) {
            this.orderNum = orderNum;
        }
    }

    class Son extends Parent {

        @com.alibaba.fastjson.annotation.JSONField(ordinal = 3)
        @JSONField(ordinal = 3)
        private int deptCode;

        @com.alibaba.fastjson.annotation.JSONField(ordinal = 4)
        @JSONField(ordinal = 4)
        private int totalNum;

        public int getDeptCode() {
            return deptCode;
        }

        public void setDeptCode(int deptCode) {
            this.deptCode = deptCode;
        }

        public int getTotalNum() {
            return totalNum;
        }

        public void setTotalNum(int totalNum) {
            this.totalNum = totalNum;
        }
    }
}

关于性能和优化疑问

我知道fastjson2为了性能做了一些手动内联, 从而减少调用栈. 但是我发现有些方法是可以优化的, 是否必须遵从内联格式从而不去优化这些方法.

想知道JSONObject在fastjson2的设计理念

fastjson是一个非常优秀的框架,很早就开始用了最近看到了fastjson2发布就立马用一个项目来实践一下,不过在用的过程中发现JSONObject在1.0版本和2.0的版本有了重大的改变,1.0的版本是继承JSON的,由于我们用的是mongodb所以有时是直接把一个JSONObject做为一个属性存起来,升级到2.0后JSONObject是继承LinkedHashMap,导致有些场景转换时会报这个错误java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.alibaba.fastjson2.JSONObject

以下是具体的重现步骤:
存储到mongodb的数据

{ 
    "_id" : ObjectId("6195f08f5b210000a7002c14"), 
    "activityContent" : {
        "awardRule" : {
            "ruleType" : "RANDOM", 
            "ruleData" : [
                {
                    "amount" : "0.33", 
                    "percentage" : "0.70"
                }, 
                {
                    "amount" : "0.66", 
                    "percentage" : "0.15"
                }
            ]
        }
    }
}

对应的DO

@Getter
@Setter
@Document(collection = CollectionConstants.ACTIVITY)
public class ActivityDO extends BaseDO {

    private JSONObject activityContent;

}

相应的Unit Test

    @Test
    void fetchReward() {
        Optional<ActivityDO> activityOpt = activityAutoRepo.findById("6195f08f5b210000a7002c14");
        ActivityDO activityDO = activityOpt.get();
        JSONObject activityContent = activityDO.getActivityContent();
         // 这里getJSONObject就会报错
        JSONObject awardRule = activityContent.getJSONObject("awardRule");
    }

解决方案

    @Test
    void fetchReward() {
        Optional<ActivityDO> activityOpt = activityAutoRepo.findById("6195f08f5b210000a7002c14");
        ActivityDO activityDO = activityOpt.get();
        JSONObject activityContent = activityDO.getActivityContent();
        String activityContentStr = JSON.toJSONString(activityContent);
        JSONObject contentObj = JSON.parseObject(activityContentStr);
        JSONObject awardRule = contentObj.getJSONObject("awardRule");
    }

这样转为String再转为JSONObject, 我只是想了解一下在2.0版本的JSONObject优化的理念和这样改的好处是什么,这样改后就不能把JSONObject理解原来的json对象了,以后再有这个场景要么直接存泛形要么就直接转String存了,有了解这样改好处的朋友有时间麻烦解答一下,谢谢了。

jpath星号通配符异常行为

String data = "{"status":"success","data":{"resultType":"matrix","result":[{"metric":{},"values":[[1632273205,"3"],[1632273210,"3"],[1632273215,"3"],[1632273220,"3"],[1632273225,"3"],[1632273230,"3"],[1632273235,"3"],[1632273240,"3"],[1632273245,"3"],[1632273250,"3"],[1632273255,"3"],[1632273260,"3"],[1632273265,"3"],[1632273270,"3"],[1632273275,"3"],[1632273280,"3"],[1632273285,"3"],[1632273290,"3"],[1632273295,"3"],[1632273300,"3"],[1632273305,"3"]]}]}}\n";
Object obj = JSONPath.eval(data, "$.data.result[0].values[*][0]");
只返回一个JSONArray,[1632273205, 3]
预期应该返回
[1632273205,1632273210,1632273215........]

ref alibaba/fastjson#3903

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.